• C/C++ Qt 标准Dialog对话框组件应用


    在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种,这里我将总结本人在开发过程中常用到的标准对话框的使用技巧。

    Qt框架下,常用的标准对话框有下面这几种:

    • QMessageBox 提示信息框
    • QInputDialog 基本输入对话框(文本输入,整数输入,浮点数输入,单选框输入)
    • QFileDialog 文件选择对话框(选择文件,多选文件,保存文件)

    QMessageBox 消息弹窗

    消息对话框用于提示用户,常见的有四种分别是:提示,警告,错误,确认,代码归纳如下所示。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include 
    
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // 弹出各种MessageBox
    void MainWindow::on_pushButton_clicked()
    {
        QString dlgTitle="消息框";
        QString strInfo="文件已被修改,是否保存修改 ?";
    
        QMessageBox::StandardButton defaultBtn = QMessageBox::NoButton; // 缺省按钮
        QMessageBox::StandardButton result;                             // 返回选择的按钮
    
        // 弹窗分类 Question information warning critical
        result=QMessageBox::question(this, dlgTitle, strInfo,QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,defaultBtn);
    
        if (result==QMessageBox::Yes)
            ui->plainTextEdit->appendPlainText("Question消息框: Yes 被选择");
        else if(result==QMessageBox::No)
            ui->plainTextEdit->appendPlainText("Question消息框: No 被选择");
        else if(result==QMessageBox::Cancel)
            ui->plainTextEdit->appendPlainText("Question消息框: Cancel 被选择");
        else
            ui->plainTextEdit->appendPlainText("Question消息框: 无选择");
    }
    
    // 弹出关于提示
    void MainWindow::on_pushButton_2_clicked()
    {
        QString dlgTitle="about 消息框";
        QString strInfo="我开发的数据查看软件 V1.0 \n 保留所有版权";
        QMessageBox::about(this, dlgTitle, strInfo);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    QMessageBox 退出事件

    弹窗组件还可以配合QCloseEvent实现事件通知机制,例如当窗体被关闭则提示用户是否关闭窗体。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include 
    #include 
    
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    // 窗口关闭时询问是否退出
    void MainWindow::closeEvent(QCloseEvent *event)
    {
       QMessageBox::StandardButton result=QMessageBox::question(this, "确认", "确定要退出本程序吗?",
                          QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
                          QMessageBox::No);
    
        if (result==QMessageBox::Yes)
            event->accept();
        else
            event->ignore();
    }
    
    // By : LyShark
    // https://www.cnblogs.com/lyshark
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    QInputDialog 对话框

    该对话框长用于输入一段特殊的文本,浮点数,或者选择一个列表框中的选项,该功能用于简单的用户交互场景。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include 
    #include 
    
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // 文本输入对话框
    void MainWindow::on_pushButton_clicked()
    {
        QString dlgTitle="输入文字对话框";
        QString txtLabel="请输入文件名";
        QString defaultInput="新建文件.txt";
        QLineEdit::EchoMode echoMode=QLineEdit::Normal;       // 正常文字输入
        // QLineEdit::EchoMode echoMode=QLineEdit::Password;  // 密码输入
    
        bool flag = false;
        QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &flag);
        if (flag && !text.isEmpty())
        {
            ui->plainTextEdit->appendPlainText(text);
        }
    }
    
    // 整数数值输入对话框
    void MainWindow::on_pushButton_2_clicked()
    {
        QString dlgTitle="输入整数对话框";
        QString txtLabel="设置字体大小";
        int defaultValue=ui->plainTextEdit->font().pointSize();   // 现有字体大小
        int minValue=6, maxValue=50, stepValue=1;                 // 范围(步长)
        bool flag=false;
        int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,stepValue,&flag);
        if (flag)
        {
            QFont font=ui->plainTextEdit->font();
            font.setPointSize(inputValue);
            ui->plainTextEdit->setFont(font);
        }
    }
    
    // 浮点数输入对话框
    void MainWindow::on_pushButton_3_clicked()
    {
        QString dlgTitle="输入浮点数对话框";
        QString txtLabel="输入一个浮点数";
        float defaultValue=3.13;
    
        float minValue=0, maxValue=10000;  // 范围
        int decimals=2;                    // 小数点位数
    
        bool flag=false;
        float inputValue = QInputDialog::getDouble(this, dlgTitle,txtLabel,defaultValue, minValue,maxValue,decimals,&flag);
        if (flag)
        {
            QString str=QString::asprintf("输入了一个浮点数:%.2f",inputValue);
            ui->plainTextEdit->appendPlainText(str);
        }
    }
    
    // 单选框条目选择对话框
    void MainWindow::on_pushButton_4_clicked()
    {
        QStringList items;                        // 列表内容
        items <<"优秀"<<"良好"<<"合格"<<"不合格";    // 放入列表
    
        QString dlgTitle="条目选择对话框";
        QString txtLabel="请选择级别";
        int curIndex=0; //初始选择项
        bool editable=false;                       // 是否可编辑
        bool flag=false;
        QString text = QInputDialog::getItem(this, dlgTitle,txtLabel,items,curIndex,editable,&flag);
    
        if (flag && !text.isEmpty())
        {
            ui->plainTextEdit->appendPlainText(text);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    QFileDialog 对话框

    该对话框用于对文本的操作,例如打开文件,保存文件,选择文件夹等,当点击选择后,对话框会自动提取出文件路径。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include 
    
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // 选择单个文件对话框
    void MainWindow::on_pushButton_clicked()
    {
        QString curPath=QDir::currentPath();                                       // 获取系统当前目录
    //  QString  curPath=QCoreApplication::applicationDirPath();                   // 获取应用程序的路径
        QString dlgTitle="选择一个文件";                                             // 对话框标题
        QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)";  // 文件过滤器
    
        QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    
        if (!aFileName.isEmpty())
        {
            ui->plainTextEdit->appendPlainText(aFileName);
        }
    }
    
    // 选择多个文件对话框
    void MainWindow::on_pushButton_2_clicked()
    {
        // QString curPath=QCoreApplication::applicationDirPath();                // 获取应用程序的路径
        QString curPath=QDir::currentPath();                                      // 获取系统当前目录
        QString dlgTitle="选择多个文件";                                            // 对话框标题
        QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; // 文件过滤器
    
        QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
        for (int i=0; i<fileList.count();i++)
        {
            // 循环将文件路径添加到列表中
            ui->plainTextEdit->appendPlainText(fileList.at(i));
        }
    }
    
    // 选择文件夹
    void MainWindow::on_pushButton_3_clicked()
    {
        QString curPath=QCoreApplication::applicationDirPath();    // 获取应用程序的路径
        // QString curPath=QDir::currentPath();                    // 获取系统当前目录
    
        // 调用打开文件对话框打开一个文件
        QString dlgTitle="选择一个目录";                             // 对话框标题
        QString selectedDir=QFileDialog::getExistingDirectory(this,dlgTitle,curPath,QFileDialog::ShowDirsOnly);
        if (!selectedDir.isEmpty())
        {
            ui->plainTextEdit->appendPlainText(selectedDir);
        }
    }
    
    // 保存文件对话框
    void MainWindow::on_pushButton_4_clicked()
    {
        QString curPath=QCoreApplication::applicationDirPath();                  // 获取应用程序的路径
        QString dlgTitle="保存文件";                                              // 对话框标题
        QString filter="文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; // 文件过滤器
        QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
        if (!aFileName.isEmpty())
        {
            ui->plainTextEdit->appendPlainText(aFileName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

  • 相关阅读:
    【和小白一起学elk】CH1:elasticsearch8.4.1及其插件head和kibana的安装
    【解决方案】vue 项目 npm run dev 时报错:‘cross-env‘ 不是内部或外部命令,也不是可运行的程序
    用ZeroTier搭建属于自己的虚拟局域网(VLAN)
    【Android 屏幕适配】屏幕适配通用解决方案 ⑦ ( PercentRelativeLayout 百分比布局方案 | 该布局已废弃本方案仅做参考 )
    laravel session 生命周期顶级边路
    Plex踩坑——plex web无法找到媒体服务器
    全新服务器安装centos7系统及使用
    postman接收后端返回的文件流并自动下载
    iPhone14有望实现息屏显示;张朝阳回应搜狐全体员工遭遇工资补助诈骗,损失总额少于5万;GitLab 15发布|极客头条
    ~LVS的nat模式+ipvsadm命令的使用+lvs的dr模式实现+lvs火墙标记
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/127822451