对话框介绍

  • 对话框是于用户进行简易交互的顶层窗口
  • QDialog是Qt中所有对话框窗口的父类,是一种容器类型的组件
  • QDialog继承于QWidget类,如下图所示:

QWidget和QDialog有什么不同

QDialog:

  • QDialog是定制了窗口式样的特殊的QWidget
  • QDialog只能作为专用的交互窗口
  • QDialog不能作为子部件,嵌入其它容器中

QWidget:

  • QWidget如果没有父组件,则将会成为一个主窗口,
  • QWidget如果有父组件,则将成为其父组件的子部件,嵌入到其父组件里

代码试验: QWidget和QDialog区别

代码1:

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4.  
  5. QWidget w;
  6. w.resize(,);
  7.  
  8. QDialog d(&w);
  9. d.resize(,);
  10.  
  11. w.show();
  12. d.show();
  13.  
  14. return a.exec();
  15. }

效果:

可以看到,对话框始终都是作为独立的交互窗口

代码2:

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4.  
  5. QWidget w1;
  6. w1.resize(,);
  7.  
  8. QWidget w2(&w1);
  9. w2.resize(,);
  10.  
  11. w1.show();
  12. w2.show();
  13.  
  14. return a.exec();
  15. }

效果:

可以看到只出现了一个窗口,并没有出现第二个窗口

对话框类型

模态对话框

  • 属于阻塞式调用,指没有关闭该对话框之前,是无法与其它任何窗口进行交互的
  • 用于依赖用户选择的场合,比如:选项设置,消息提示,字体设置等
  • 在栈上创建模态对话框是最简单常用的方式
  • 使用exec()进入对话框的消息循环,从而实现阻塞式调用

实验代码:

  1. int main(int argc, char *argv[])
  2. {
  3.  
  4. QApplication a(argc, argv);
  5.  
  6. QWidget w;
  7. w.resize(,);
    w.show();
  8.  
  9. QDialog d(&w);
  10. d.resize(,);
  11. d.exec(); //进入对话框d的消息循环,从而实现阻塞式调用
  12.  
  13. return a.exec();
  14. }

非模态对话框  

  • 属于非阻塞调用,指出现该对话框时,也可以与父窗口进行交互
  • 用于特殊功能设置的场合,比如:查找操作
  • 一般情况下非模态对话框需要在堆上创建,避免自动被摧毁
  • 非模态对话框需要通过setAttribute()成员函数指定Qt::WA_DeleteOnClose属性
  • Qt::WA_DeleteOnClose表示:退出窗口后,让Qt自动摧毁这个对话框
  • 使用show()来显示对话框窗口,从而实现非阻塞调用

实验代码:

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication a(argc, argv);
  4.  
  5. QWidget w;
  6. w.resize(,);
  7. w.show();
  8.  
  9. QDialog *d = new QDialog(&w);
  10.  
  11. d->setAttribute(Qt::WA_DeleteOnClose);
  12. d->resize(,);
  13. d->show();
  14.  
  15. return a.exec();
  16. }

混合模态对话框

  • 在非模态对话框的基础上调用QDialog::setModal(true)成员函数实现

实验代码:

  1. int main(int argc, char *argv[])
  2. {
  3.  
  4. QApplication a(argc, argv);
  5.  
  6. QWidget w;
  7. w.resize(,);
  8. w.show();
  9.  
  10. QDialog *d = new QDialog(&w);
  11. d->setAttribute(Qt::WA_DeleteOnClose);
  12. d->setModal(true);
  13. d->resize(,);
  14. d->show();
  15.  
  16. return a.exec();
  17. }

对话框返回值处理

  • 只有模态对话框才有返回值概念
  • QDialog::exec()的返回值作为交互结果

  -使用void QDialog::done ( int r ) 作为交互结果,将r值返回给exec()

  -返回值为QDialog::Accepted时,表示用户操作成功

  -返回值为QDialog::Rejected时,表示用户操作失败

  -也可以自定义返回数值

非模态示例-制作查找对话框

由于查找对话框每次打开时,都会有上次状态的内容,所以需要用到QSharedPointer动态指针

QFindDialog对话框:

  1. class QFindDialog : public QDialog
  2. {
  3. private:
  4. QLabel label;
  5. QLineEdit edit;
  6. QPushButton ButtonFind;
  7. QPushButton ButtonCancel;
  8. QCheckBox CkBoxCase;
  9. QGroupBox GrpBoxDir;
  10. QRadioButton PreButton;
  11. QRadioButton NextButton;
  12. QGridLayout GLayout;
  13. QHBoxLayout HBLayout;
  14. public:
  15. QFindDialog(QWidget* parent=);
  16. };
  17.  
  18. QFindDialog::QFindDialog(QWidget *parent) :
  19. QDialog(parent,Qt::WindowCloseButtonHint|Qt::Drawer),
  20. label("查找内容:",this),
  21. edit(this),
  22. ButtonFind("查找下一个",this),
  23. ButtonCancel("取消",this),
  24. CkBoxCase("区分大小写",this),
  25. GrpBoxDir("方向",this),
  26. PreButton("向上",this),
  27. NextButton("向下",this),
  28. GLayout(this),
  29. HBLayout(this)
  30. {
  31. PreButton.setChecked(true);
  32. HBLayout.addWidget(&PreButton);
  33. HBLayout.addWidget(&NextButton);
  34. GrpBoxDir.setLayout(&HBLayout); //将单选按钮添加到QGroupBox分组框
  35. GLayout.setSpacing();
  36. GLayout.addWidget(&label,,);
  37. GLayout.addWidget(&edit,,);
  38. GLayout.addWidget(&ButtonFind,,);
  39. GLayout.addWidget(&CkBoxCase,,);
  40. GLayout.addWidget(&GrpBoxDir,,);
  41. GLayout.addWidget(&ButtonCancel,,);
  42. this->setLayout(&GLayout);
  43.   
  44. setWindowTitle("查找");
  45. }

widget窗口文件:

  1. class Widget : public QWidget
  2. {
  3. Q_OBJECT
  4. private :
  5. QPushButton btn;
  6. QSharedPointer<QFindDialog> FindDialog; //动态指针
  7. private slots:
  8. void onclickedbtn();
  9. public:
  10. explicit Widget();
  11. };
  12.  
  13. Widget::Widget():
  14. btn("查找",this),
  15. FindDialog(new QFindDialog(this))
  16. {
  17. connect(&btn,SIGNAL(clicked()),this,SLOT(onclickedbtn()));
  18.  
  19. }
  20. void Widget::onclickedbtn()
  21. {
  22. FindDialog->show(); //显示查找对话框
  23. }
  1. 效果:

  1.  
  1.  

8.QT-对话框(模态与非模态)的更多相关文章

  1. Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)

    概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...

  2. Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

    一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...

  3. Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

    在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...

  4. MFC模态和非模态对话框编程

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程 ...

  5. C++ 模态与非模态对话框

    视频教程:模态与非模态对话框1 模态对话框:子窗口关闭之前,不能对父窗口操作 非模态对话框:子窗口关闭之前,可以对父窗口操作 插入一个对话框: 资源视图--->右击---> 进行类的绑定: ...

  6. MFC 点击按钮,弹出另一个对话框(模态及非模态对话框)

    1. 模态对话框 资源视图->Dialog->右键->添加资源->新建->对话框->右键->添加类. 例如:在A_dialog中点击按钮弹出B_dialog  ...

  7. QT对话框模式与非模式

    QT模态对话框及非模态对话框 非模态对话框(Modeless Dialog)的概念不是模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于在模态来显示对 ...

  8. Qt对话框之二:模态、非模态、半模态对话框

    一.模态对话框 模态对话框:阻塞同一应用程序中其它可视窗口输入的对话框.模态对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口. 显示模态对话 ...

  9. QT 中的模态和非模态对话框

    void MainWindow::on_pushButton_clicked() { //模态 QDialog dlg(this); dlg.resize(100,100); dlg.exec(); ...

  10. Qt模态与非模态

    模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...

随机推荐

  1. SpringBoot项目如何进行打包部署

    springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spring ...

  2. PHP trait

    ps:由于PHP是单继承的,无法继承多个类所以可以用triat(关键字,特性)来命名达到子类继承多个父类的效果:暂且理解为类吧.class = trait <?php trait A { pub ...

  3. 剑指offer-第一个只出现一次的字符

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置   解题思路 由于char类型一共有256种可能,所以开辟一个数组ha ...

  4. cannot import name 'ChineseAnalyzer'

    在python3.6下安装jieba3k的时候报错: from jieba.analyse import ChineseAnalyzer ImportError: cannot import name ...

  5. 算法题丨Remove Element

    描述 Given an array and a value, remove all instances of that value in-place and return the new length ...

  6. kafka---broker 保存消息

    1 .存储方式 物理上把 topic 分成一个或多个 patition(对应 server.properties 中的 num.partitions=3 配置),每个 patition 物理上对应一个 ...

  7. 查看centos版本及32还是64位

    1.[root@mini1 ~]# cat /etc/issue 2.[root@mini1 ~]#  cat /etc/redhat-release 查看位数: [root@mini1 ~]#  g ...

  8. MySQL5.7.21解压版安装详细教程以及一些问题的解决

    笔者是最近玩mysql的时候玩坏了,想写点东西记录下.我安装的是MySQL5.7.21,安装之后没有my.ini文件. 遇到了2个问题,一是mysql服务启动不了,被my.ini整了,二是root密码 ...

  9. jacascript AJAX 学习

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! AJAX 是 asynchronous javascript and XML 的简写,就是异步的 java ...

  10. OpenGL平面阴影

    几种绘制阴影的方法 在OpenGL中,比较常见的绘制阴影的方法有:shadow mapping,shadow volumes以及一种在红宝书上提及的适合在确定平面上绘制阴影的方法. 平面阴影 在确定的 ...