Qt对话框QDialog

  • 1. 模态和非模态对话框
  • 2. 多窗口切换
    • 2.1 信号和槽
    • 2.2 练习信号和槽例程
    • 2.3 自定义对话框
  • 3. 标准对话框
    • 3.1 颜色对话框
    • 3.2 文件对话框
    • 3.3 字体对话框
    • 3.4 输入对话框
    • 3.5 消息对话框
    • 3.6 进度对话框
    • 3.7 错误消息对话框
    • 3.8 向导对话框
  • 4. 资源下载

1. 模态和非模态对话框

  • QDialog类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。
  • 按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框被分成两类:模态和非模态。
    QDialog dialog(this);dialog.show();//dialog窗口一闪而过,只剩下MyWidget窗口了//这是因为对于一个函数中定义的变量,函数执行完城后,变量就会被自动释放
    QDialog * dialog = new QDialog(this);dialog->show();//定义了一个指向QDialog类对象的指针,指定dialog的父窗口为MyWidget类对象,new运算符开辟了内存空间//并不需要delete指针dialog,dialog指向了MyWidget,MyWidget销毁时也会销毁其子窗口//这一种是模态对话框
    QDialog dialog(this);dialog.exec();//这种方法同样可以让对话框显示出来,但是只有当dialog关闭之后,MyWidget窗口才会显示//这个对话框就是模态对话框
  • 模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互;
  • 而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互。
  • 要想使一个对话框称为模态对话框,只需要调用它的 exec() 函数;
  • 而要使其称为非模态对话框,可以使用 new 操作来创建,然后使用 show() 函数来显示。
  • 其实 show() 函数也可以创建模态对话框,只需在其前面使用 setModal() 函数即可。尽量采用这种方法,它可以让对话框都被看到,只不过下层的对话框无法被操作。
    QDialog * dialog = new QDialog(this);dialog->setModal(true);dialog->show();

2. 多窗口切换

2.1 信号和槽

  • Qt中使用信号和槽机制来完成对象之间的协同操作。
  • 信号和槽都是函数,比如单击窗口上的一个按钮想要弹出一个对话框,那么可以将这个按钮的单机信号和自定义的槽关联起来,在这个槽中创建一个对话框并显示它。单击这个按钮时就会发射信号,进而执行槽来显示一个对话框。

2.2 练习信号和槽例程

  • 新建widget工程
  • 编辑界面如下
  • 修改pushButton的objectName
  • 在头文件 mywidget.h 中添加槽的声明
public slots: // 槽一般使用 slots 关键字进行修饰,建议使用,以便和普通函数区分开void showChildDialog();
  • 快速添加定义的方法:点击 showChildDialog(),同时按下 Alt + Enter,会有下面的弹窗,按下回车后编辑器会转到**.cpp**页面。从源文件中添加定义,然后自动在头文件中添加声明也是同样使用的。
  • 源文件中添加如下代码
  • 这里使用了connect()函数将按钮的信号clicked()与新建的槽进行关联。
  • clicked() 信号在QPushButton类中定义,而 connect() 是QObject类中的函数,因为MyWidget类继承自QObject,所以可以直接使用它。
  • 函数的4个参数分别是:发射信号的对象,发射的信号,接收信号的对象,要执行的槽
    connect(ui->showChildButton,&QPushButton::clicked,this,&MyWidget::showChildDialog);

2.3 自定义对话框

  • 主界面和子对话框来回切换,跳进跳出,例程练习。
  • 第一步:添加自定义对话框类。然后添加两个按钮,如下图:
  • 第二步:设计信号和槽。在设计界面,按下快捷键F4就能进入部件的信号和槽的编辑模式。下图标识的就是关联退出程序按钮和对应的槽**close()**的过程:
  • 同样的,在进入主界面按钮上鼠标右键,选择转到槽…,选择对应的信号,点击OK,就会进入到代码编辑模式。
void MyDialog::on_pushButton_clicked()
{//这个accept()函数是QDialog类中的一个槽,对于使用exec()函数实现的模态对话框//执行了这个槽就会隐藏这个模态对话框,并返回QDialog::Accepted值,这里就是要使用这个值来判断是哪个按钮被按下了。//与其对应的还有一个reject()槽,它可以返回一个QDialog::Rejected值,前面的“退出程序”按钮也可以关联这个槽accept();
}
  • 前面提到了两种关联信号和槽的方法,第一种是直接在设计器中进行,这个更合适在设计器中的部件间进行。第二种方法是在设计器中直接进入相关信号的槽,这个与前面讲到的手写函数是一样的,它用的就是自动关联,这样也会在.h文件中自动添加该槽的声明,我们只需更改实现代码就好了。

  • main.cpp代码

#include "mywidget.h"
#include <QApplication>
#include "mydialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);MyWidget w;MyDialog dialog;//新建MyDialog类对象if(dialog.exec()==QDialog::Accepted)//判断dialog执行结果{w.show();//如果是按下了“进入主界面”按钮,则显示主界面return a.exec();//程序正常运行}elsereturn 0;//否则退出程序
}

void MyWidget::on_pushButton_clicked()
{//先关闭主界面,其实它是隐藏起来了,并没有真正退出,然后新建MyDialog对象close();MyDialog dlg;//如果按下了“进入主窗口按钮”,再次显示主界面//否则,因为现在已经没有显示的界面了,程序退出if(dlg.exec()==QDialog::Accepted)show();
}
  • 运行程序,发现已经实现了从登录对话框到主界面,再从主界面显示一个对话框,然后再从主界面重新进入登录界面的功能了。
  • 需要注意的是:close()槽不一定会使程序退出,只有当只剩下最后一个主界面调用close()槽时,程序才会退出;其他情况下界面只是隐藏起来了,并没有销毁。

3. 标准对话框

  • Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能。

3.1 颜色对话框

//颜色对话框
void MyWidget::on_pushButton_clicked()
{//QColorDialog的静态函数getColor()来获取颜色//4个参数:初始颜色,指定父窗口,设置对话框标题,显示alpha设置//如果不选择颜色,直接点OK,返回的color:  QColor(ARGB 1, 1, 0, 0)//(透明度, 红色, 绿色, 蓝色) 它们的数值都是0.0~1.0,有效数字为6位QColor color1=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"), QColorDialog::ShowAlphaChannel);qDebug()<<"color1: "<<color1;//前面使用的方法直接显示颜色对话框,好处是不需要创建对象。但是如果想要更灵活的设置,则可以县创建对象,然后进行各项的设置:QColorDialog dialog(Qt::red,this);dialog.setOption(QColorDialog::ShowAlphaChannel);dialog.exec();QColor color2=dialog.currentColor();qDebug()<<"color2: "<<color2;
}

3.2 文件对话框

//文件对话框
void MyWidget::on_pushButton_6_clicked()
{//这里使用QFileDialog类中的getOpenFileName()函数来获取选择的文件名,这个函数会以模态的//方式运行一个文件对话框。打开后选择一个文件,单击“打开”后,函数会返回选择的文件的文件名。//4个参数分别是:指定父窗口,设置对话框标题,指定默认打开的目录路径,设置文件类型过滤器//如果不指定文件过滤器,则默认选择所有类型的文件。//*png *jpg之间需要空格QString fileName=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg)"));qDebug()<<"fileName:"<<fileName;//如果想选择多个文件,可以使用getOpenFileNames()QStringList fileNames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"D:",tr("图片文件(*png *jpg)"));qDebug()<<"fileNames:"<<fileNames;//除此之外,QFileDialog类还提供了 getSaveFileName()函数来实现保存文件对话框和文件另存为对话框,//还有 getExistingDirectory()函数来获取一个已存在的文件夹路径。QFileDialog dialog(this);QString filePath = dialog.getExistingDirectory();qDebug()<<"filePath:"<<filePath;
}

3.3 字体对话框

//字体对话框
void MyWidget::on_pushButton_2_clicked()
{//ok用于标记是否单击了OK按钮bool ok;QFont font = QFontDialog::getFont(&ok,this);if(ok)ui->pushButton_2->setFont(font);elseqDebug()<<tr("没有选择字体!");
}

3.4 输入对话框




//输入对话框
void MyWidget::on_pushButton_7_clicked()
{bool ok;//获得字符串QString str = QInputDialog::getText(this,tr("输入字符串对话框"),tr("请输入用户名:"), QLineEdit::Normal,tr("admin"),&ok);if(ok) qDebug()<<"str: "<<str;//获得整数int value1 = QInputDialog::getInt(this,tr("输入整数对话框"),tr("请输入-1000到1000之间的整数"),100,-1000,1000,10,&ok);if(ok) qDebug()<<"value1: "<<value1;//获得浮点数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;
}

3.5 消息对话框

  • 这些不同类型的消息对话框,分别拥有不同的图标和提示音。




//消息对话框
void MyWidget::on_pushButton_4_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("这是Q书籍!"), QMessageBox::Ok);if(ret2==QMessageBox::Ok) qDebug()<<tr("提示!");//警告对话框int ret3 = QMessageBox::warning(this,tr("警告对话框"),tr("不能提前结束!"),QMessageBox::Abort);if(ret3==QMessageBox::Abort) qDebug()<<tr("警告!");//错误对话框int ret4 = QMessageBox::question(this,tr("错误对话框"),tr("发现一个严重错误!即将关闭软件!"),QMessageBox::YesAll);if(ret4==QMessageBox::YesAll) qDebug()<<tr("错误!");//关于对话框QMessageBox::about(this,tr("关于对话框"),tr("Qt 5.4.0"));
}

3.6 进度对话框

//进度对话框
void MyWidget::on_pushButton_5_clicked()
{QProgressDialog dialog(tr("文件复制速度"),tr("取消"),0,500000,this);dialog.setWindowTitle(tr("进度对话框"));     //设置窗口标题dialog.setWindowModality(Qt::WindowModal);  //将对话框设置为模态dialog.show();for(int i=0;i<500000;i++){dialog.setValue(i);                     //演示复制进度QCoreApplication::processEvents();      //设置进度条的当前值if(dialog.wasCanceled())                //按下取消按钮则弄断break;}dialog.setValue(500000);        //这样才能显示100%,因为for循环中少加了一个数qDebug()<<tr("复制结束!");
}
  • 这里使用了模态对话框,QProgressDialog还可以实现非模态对话框,不过需要定时器的帮助。

3.7 错误消息对话框

  • 写在头文件中
class QErrorMessage; //类前置声明
QErrorMessage * errordlg; //私有对象
  • 写在源文件中
//构造函数
MyWidget::MyWidget(QWidget *parent) :QMainWindow(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);errordlg=new QErrorMessage(this);
}
//错误信息对话框
void MyWidget::on_pushButton_3_clicked()
{errordlg->setWindowTitle(tr("错误信息对话框"));errordlg->showMessage(tr("这里是错误信息!"));
}

3.8 向导对话框

  • 头文件
#include <QWizard> //包含头文件//函数声明QWizardPage * createPage1();QWizardPage * createPage2();QWizardPage * createPage3();
  • 源文件
QWizardPage * MyWidget::createPage1()
{QWizardPage * page=new QWizardPage;page->setTitle("介绍");return page;
}QWizardPage * MyWidget::createPage2()
{QWizardPage * page=new QWizardPage;page->setTitle("用户选择信息");return page;
}QWizardPage * MyWidget::createPage3()
{QWizardPage * page=new QWizardPage;page->setTitle("结束");return page;
}//向导对话框
void MyWidget::on_pushButton_8_clicked()
{QWizard wizard(this);wizard.setWindowTitle("向导对话框");wizard.addPage(createPage1());wizard.addPage(createPage2());wizard.addPage(createPage3());wizard.exec();
}

4. 资源下载

https://download.csdn.net/download/weixin_38566632/85095018

Qt窗口部件——对话框QDialog相关推荐

  1. Qt窗口部件——QWidget

    QT窗口部件--QWidget 1. 窗口部件与子部件 2. 窗口类型 3. 窗口几何布局 4. qDebug调试程序 QWidget类是所有用户界面对象的基类,被称为基础窗口部件. QWidget继 ...

  2. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  3. Qt窗口部件与布局之二:布局管理

    第3章讲述了一些窗口部件,当时往界面上拖放部件时都是随意放置的,这对于学习部件的使用没有太大的影响,但是,对于一个完善的软件,布局管理却是必不可少的. 无论是想要界面中部件有一个很整齐的排列,还是想要 ...

  4. Qt窗口部件——QFrame/QAbstractButton/QLineEdit/QAbstractSpinBox/QAbstractSlider

    Qt其他窗口部件 1. QFrame 1.1 QLabel 1.2 QLCDNumber 1.3 QStackedWidget 1.4 QToolBox 2. QAbstractButton 2.1 ...

  5. Qt4_在Qt设计师中集成自定义窗口部件

    在Qt设计师中集成自定义窗口部件 在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师先察觉到它们的存在.有两种方法可以完成这一任务:改进法(promotion)和插件法(pluigin). 改 ...

  6. Qt4_IconEditor窗口部件

    子类化QWidget 许多自定义窗口部件都是对现有窗口部件的简单组合,不论它们是内置的Qt窗口部件,还是其他一些像HexSpinBox这样的自定义窗口部件. 通过对现有窗口部件的组合构建而成的自定义窗 ...

  7. Qt4_中央窗口部件

    中央窗口部件 QMainWindow的中央区域可以被任意种类的窗口部件所占用.下面给出的是对所有可能情形的概述. 使用一个标准的Qt窗口部件 像QTableWidget或者QTextEdit这样的标准 ...

  8. Qt4_使用窗口部件

    创建窗口 如何创建一个你自己的窗口部件,描述如何控制一个窗口部件的最小大小和最大大小,并且介绍了窗口部件的名称. 创建项目时候,选QWidget并把Widget修改成MyWidget.打开mywidg ...

  9. 深度探索Qt窗口系统——布局篇

    深度探索Qt窗口系统--布局篇 虽然界面管理器可以完成窗口布局,但是对于动态布局的情况下,这种做法就无能为力了,现实中界面经常要支持国际化,对于同一内容用不同语言翻译可能长度不一,这就需要窗口动态布局 ...

最新文章

  1. Unity 摄像机搭配陀螺仪的使用
  2. Linux 配置IP地址,子网,网关,DNS,linux远程, wget 下载工具
  3. Linux中sftp加权限,Linux 搭建Sftp服务并进行权限设置
  4. PHP安装加载yaf扩展
  5. getservbyname php,php中getservbyport与getservbyname函数用法实例
  6. 这些年我对微服务的理解
  7. Support for the experimental syntax 'dynamicImport' isn't currently enabled
  8. spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
  9. 关于vmvare网络连接方式的介绍与实践
  10. 数说故事“AI虚拟偶像研究室”第二期虚拟偶像数据分析研究报告
  11. 智能音箱的差评|为什么我要买一堆垃圾回来吃灰!
  12. 3-4课:各种花式编程语言大放送
  13. 【基础】存储过程IN、OUT、INOUT参数模式
  14. 【ceph】分布式存储ceph
  15. WORD文档打开文件时老提示发送错误报告,或者打印不全
  16. 网站域名备案需要多长时间?个人经验分享
  17. python encoding报错_Python:'gbk' codec can't encode character
  18. 使用 pkg 打包 node服务端 项目
  19. 系统分析师考试备考方案
  20. LMO·3rd - 报名通知

热门文章

  1. Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书
  2. Nginx 屏蔽ip地址的方法
  3. Ubuntu16安装OpenStack
  4. I have no name !;sudo: unknown uid 1000: who are you?
  5. 编码优先级表达的严重性
  6. VBA调用bat,doc 命令行 窗口关闭之后,VBA代码 再继续执行
  7. Eclipse中Tab的配置(设置为按一下Tab键,效果是按4次空格,而不是4个空格的缩进)
  8. java异常处理:finally中不要return
  9. Android Studio支持Java1.8的解决方案
  10. Vue-cli proxyTable 解决开发环境的跨域问题(转)