当前位置: 首页 > news >正文

Qt 入门 4 之标准对话框

Qt 入门 4 之标准对话框

Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。

  • 本文将以一个新的项目为主介绍不同类型的对话框,新建Qt Widgets 应用程序,双击ui文件后添加按钮并修改文字显示:
    在这里插入图片描述
    在这里插入图片描述
  1. 颜色对话框
  • 颜色对话框 QColorDialog 提供了一个可以获取指定颜色的对话框部件
  • 设计模式下点击.ui文件,选中颜色对话框按钮,右键转到槽选中clicked() 后进入函数定义并修改如下:
void MyWidget::on_pushButton_clicked()
{
    QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));
    qDebug()<<"color:"<<color;
}
  • 编译执行如下图,这里使用了 QColorDialog的静态函数getColor()来获取颜色,它的3个参数的作用分别是:设置初始颜色、指定父窗口和设置对话框标题。这里的Qt::red是Qt预定义的颜色对象,可以直接单击该字符串,然后按下F1查看其快捷帮助,或者在帮助索引中通过 Qt::GlobalColor 关键字,从而查看到所有的预定义颜色列表。**getColor()**函数返回一个 QColor类型数据。现在运行程序,然后单击“颜色对话框”按钮,如果不选择颜色,直接单击 OK,那么输出信息应该是QColor(ARGB1,1,0,0),这里的4个数值分别代表透明度(alpha)、红色(red)、绿色(green)和蓝色(blue)。它们的数值都是从0.0-1.0,有效数字为6位。对于alpha来说,1.0表示完全不透明,这是默认值,而0.0表示完全透明。对于三基色红、绿、蓝的数值,还可以使用0-255来表示,颜色对话框中就是使用这种方法。其中,0表示颜色最浅,255表示颜色最深。在0-255与0.0-1.0之间可以通过简单的数学运算来对应,其中0对应0.0,255对应1.0。
    在这里插入图片描述

  • 在颜色对话框中还可以添加对alpha的设置,就是在**getColor()**函数中再使用最后一个参数:

QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);
qDebug()<<"color:"<<color;
  • 前边使用了QColorDialog 类的静态函数来直接显示颜色对话框,好处是不用创建对象,但是如果想要更灵活的设置,则可以先创建对象,然后进行各项设置:
void MyWidget::on_pushButton_clicked()
{
    QColorDialog dialog(Qt::red,this);    //创建对象
    dialog.setOption(QColorDialog::ShowAlphaChannel);
    dialog.exec(); //以模态方式运行对话框
    QColor color=dialog.currentColor();
    qDebug()<<"color:"<<color;
}

2.文件对话框

  • 文件对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框。继续在 mywidget.cpp中添加#include<QFileDialog>头文件,然后从设计模式转到“文件对话框”按钮的单击信号槽,并更改如下:
void MyWidget::on_pushButton_5_clicked()
{
   //将会打开默认盘中的后缀文件
   QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg"));
   qDebug()<<"fileName:"<<filename;
}
  • 这里使用了 QFileDialog类中的**getOpenFileName()**函数来获取选择的文件名,它的4个参数的作用分别是:指定父窗口设置对话框标题、指定默认打开的目录路径和设置文件类型过滤器。这个函数会以模态方式运行一个文件对话框。打开后选择一个文件,单击“打开”按钮后,这个函数便可以返回选择的文件的文件名。如果不指定文件过滤器,则默认选择所有类型的文件。这里指定了只选择png和jpg两种格式的图片
  • 也支持同时选择其他类型的文件:
 QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg);;文本文件(*txt)"));

在这里插入图片描述

  • 前边只支持选择单个文件,要同时选择多个文件,则可以使用getOpenFileNames()函数:
   QStringList filenames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"F:",tr("图片文件(*png,jpg"));
  • 运行程序就可以同时选择多个图片文件了,多个文件名存放在QStringList类型变量中。当然也可以不使用这些静态函数,而是建立对话框对象来操作。除了上面的两个函数外,QFileDialog类还提供了getSaveFileName()函数来实现保存文件对话框和文件另存为对话框,还有getExistingDirectory()函数来获取一个已存在的文件夹路径。因为它们的用法与上面的例子类似,这里就不再举例。
  1. 字体对话框
  • 字体对话框QFontDialog类提供了一个可以选择字体的对话框部件。先添加#include <QFontDialog>头文件,然后转到“字体对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_2_clicked()
{
    //ok用于标记是否单击了 OK 按钮
    bool ok;
    QFont font=QFontDialog::getFont(&ok,this);
    //如果单击OK按钮,那么让“字体对话框”按钮使用新字体
    //如果单击Cancel按钮,那么输出信息
    if(ok)
        ui->pushButton_2->setFont(font);
    else
        qDebug()<<tr("没有选择字体!");
}

在这里插入图片描述

  • 这里使用了QFileDialog类的 getFont() 静态函数来获取选择的字体。这个函数的第一个参数是bool类型变量,用来存放按下的按钮状态,比如在打开的字体对话框中单击了OK按钮,那么这里的ok就为true,这样来告诉程序已经选择了字体,如下图是选择了微软雅黑 14号字体的显示结果:
    在这里插入图片描述
  1. 输入对话框
  • 输入对话框 QInputDialog类用来提供一个对话框,可以让用户输入一个单一的数值或字符串。先添加头文件#include <QInputDialog>,然后进入“输人对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_6_clicked()
{
   bool ok;
   //获取字符串
   QString string = QInputDialog::getText(this,tr("输入字符串对话框"),tr("请输入用户名"),QLineEdit::Normal,tr("admin"),&ok);
   if(ok)
       qDebug()<<"string:"<<string;
   //获取整数
   int value = QInputDialog::getInt(this,tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"),100,-1000,1000,10,&ok);
   if(ok)
       qDebug()<<"value:"<<value;

   //获取浮点数
   double value2=QInputDialog::getDouble(this,tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);
   if(ok)
       qDebug()<<"value2:"<<value2;
   QStringList items;
   items<<tr("条目1")<<tr("条目2");

   //获取条目
   QString item=QInputDialog::getItem(this,tr("输入条目对话框"),tr("请选择或输入一个条目"),items,0,true,&ok);
   if(ok)
       qDebug()<<"item:"<<item;
}
  • 分别使用不同的函数定义了输入不同类型的对话框,运行如下:
    在这里插入图片描述
  1. 消息对话框
  • 消息对话框QMessageBox类提供了一个模态的对话框来通知用户一些信息,或者向用户提出一个问题并且获取答案。先添加头文件#include,然后转到“消息对话框”按钮的单击信号槽中,添加如下代码:
void MyWidget::on_pushButton_3_clicked()
{
    //问题对话框
    int ret1 = QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);
    if(ret1 == QMessageBox::Yes)
        qDebug()<<tr("问题!");

    //提示对话框
    int ret2 = QMessageBox::information(this,tr("提示对话框"),tr("这是Qt书籍!"),QMessageBox::Ok);
    if(ret2 == QMessageBox::Ok)
        qDebug()<<tr("提示!");

    //警告对话框
    int ret3 = QMessageBox::warning(this,tr("警告对话框"),tr("不能提前结束!"),QMessageBox::Yes,QMessageBox::No);
    if(ret3 == QMessageBox::Abort)
        qDebug()<<tr("警告!");

    //错误对话框
    int ret4 = QMessageBox::critical(this,tr("严重错误对话框"),tr("发现一个严重错误!"),QMessageBox::Yes,QMessageBox::No);
    if(ret4 == QMessageBox::YesAll)
        qDebug()<<tr("错误!");

    //关于对话框
    QMessageBox::about(this,tr("关于对话框"),tr("Qt Creator 普及工作!"));
}

在这里插入图片描述

  1. 进度对话框
  • 进度对话框 QProgressDialog对一个耗时较长操作的进度提供了反馈。先添加#include <QProgressDialog>头文件,然后转到“进度对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_7_clicked()
{
    QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);
    dialog.setWindowTitle(tr("进度对话框"));  //设置窗口标题
    dialog.setWindowModality(Qt::WindowModal);   //将对话框设置为模态
    dialog.show();
    for(int i=0;i<50000;i++)    //演示复制进度
    {
        dialog.setValue(i);     //设置进度条的当前值
        QCoreApplication::processEvents();  //避免界面冻结
        //QThread::sleep(1);
        if(dialog.wasCanceled())
            break;
    }
    dialog.setValue(50000);    //这样才显示100%,因为for循环中少加了一个数
    qDebug()<<tr("复制结束!");
}

在这里插入图片描述

  1. 错误信息对话框
  • 错误信息对话框QErrorMessage类提供了一个显示错误信息的对话框。首先打开mywidget.h文件添加类前置声明:
class QErrorMessage;
  • 然后添加私有对象:
ErrorMessage *errordlg;
  • 下面到mywidget.cpp添加头文件#include <QErrorMessage>,并在构造函数中添加如下代码:
errordlg=newQErrorMessage(this);
  • 然后从设计模式转到“错误信息对话框”按钮的单击信号槽添加代码
void Mywidget::on pushButton 7 clicked()
{
    errordlg->setwindowTitle(tr("错误信息对话框"));
    errordlg->showMessage(tr("这里是出错信息!));
}
  • 运行如下:
    在这里插入图片描述
  1. 向导对话框
  • 向导对话框QWizard类提供了一个设计向导界面的框架。对于向导对话框,读者应该已经很熟悉了,比如安装软件时的向导和创建项目时的向导。QWizard之所以被称为框架,是因为它具有设计一个向导全部的功能函数,可以使用它来实现想要的效果。Qt中包含了 Trivial Wizard、License Wizard和Class Wizard这3个示例程序,可以参考一下。
  • 打开 mywidget.h文件,然后添加头文件#include <QWizard>,在MyWidget 类的声明中添加private类型函数声明:
  QWizardPage* createPage1();
    QWizardPage* createPage2();
    QWizardPage* createPage3();
  • 这里声明了3个返回值为QWizardPage类对象的指针函数,用来生成3个向导页面。然后在mywidget.cpp文件中对这3个函数进行定义:
QWizardPage* MyWidget::createPage1()
{
    QWizardPage* page=new QWizardPage;
    page->setTitle(tr("介绍"));
    return page;
}
QWizardPage* MyWidget::createPage2()
{
    QWizardPage* page=new QWizardPage;
    page->setTitle(tr("用户选择信息"));
    return page;
}
QWizardPage* MyWidget::createPage3()
{
    QWizardPage* page=new QWizardPage;
    page->setTitle(tr("结束"));
    return page;
}
  • 在各个函数中分别新建了向导页面,并且设置了它们的标题。下面转到“向导对话框”按钮的单击信号槽中,更改如下:
void MyWidget::on_pushButton_8_clicked()
{
    QWizard wizard(this);
    wizard.setWindowTitle(tr("向导对话框"));
    wizard.addPage(createPage1());   //添加向导对话框
    wizard.addPage(createPage2());
    wizard.addPage(createPage3());
    wizard.exec();
}
  • 运行如下:

在这里插入图片描述

相关文章:

  • MySQL高可用性
  • WordPress超简洁的主题:果果CMS主题
  • LeetCode 3396.使数组元素互不相同所需的最少操作次数:O(n)一次倒序遍历
  • GEO, TCGA 等将被禁用?!这40个公开数据库可能要小心使用了
  • 250408_解决加载大量数据集速度过慢,耗时过长的问题
  • 在 macOS 上连接 PostgreSQL 数据库(pgAdmin、DBeaver)
  • 第十四届蓝桥杯大赛软件赛国赛C/C++研究生组
  • SVT-AV1学习-函数selfguided_restoration_fast_internal
  • 机器学习课堂7用scikit-learn库训练SVM模型
  • duckdb源码阅读学习路径图
  • 题目练习之map的奇妙使用
  • 计算机视觉算法实战——实例分割算法深度解析
  • Linux系统安装Miniconda以及常用conda命令介绍
  • DeepSeek+dify知识库,查询数据库api 方式
  • C++蓝桥杯实训篇(三)
  • with_listeners 运行流程与解析
  • Flask(九)邮件发送与通知系统
  • 分布式架构:Dubbo 协议如何做接口测试
  • 从振动谐波看电机寿命:PdM策略下的成本控制奇迹
  • Json快速入门
  • 经济日报整版聚焦:上海构建法治化营商环境,交出高分答卷
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • “水运江苏”“航运浙江”,江浙两省为何都在发力内河航运?
  • 国家林草局原党组成员、副局长李春良接受审查调查
  • 火车站员工迟到,致出站门未及时开启乘客被困?铁路部门致歉
  • 当我们提起拉动消费时,应该拉动什么消费?