码迷,mamicode.com
首页 > 其他好文 > 详细

对话框Dialog

时间:2015-12-22 14:37:33      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

QMainWindow

QMainWindow是 Qt 框架带来的一个预定义好的主窗口类。

主窗口,就是一个普通意义上的应用程序(不是指游戏之类的那种)最顶层的窗口。通常是由一个标题栏,一个菜单栏,若干工具栏和一个任务栏。在这些子组件之间则是我们的工作区。

通过添加动作来添加菜单和工具栏等,比如添加一个打开菜单和工具

 1  QAction *openaction;
 2  openaction = new QAction(QIcon(":/img/open"),tr("&Open"),this);
 3  openaction->setShortcut(QKeySequence::Open);    //给菜单指定快捷键
 4  openaction->setStatusTip(tr("open an existing file"));  //提示
 5 
 6  //加入菜单栏的File中
 7  QMenu *file = menuBar()->addMenu(tr("&File"));
 8  file->addAction(openaction);
 9     
10  //加入工具栏
11  QToolBar *toolBar = addToolBar(tr("&File"));
12  toolBar->addAction(openaction);

 

技术分享

QDialog

Qt 中使用QDialog类实现对话框

QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

1 QDialog dialog;    //顶层,在任务栏显示
2 QDialog dialog(this)    //子窗口,在任务栏不显示

 

模态和非模态

对话框分为模态对话框和非模态对话框。所谓模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。

Qt 支持模态对话框和非模态对话框。其中,Qt 有两种级别的模态对话框:应用程序级别的模态和窗口级别的模态,默认是应用程序级别的模态。应用程序级别的模态是指,当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。窗口级别的模态是指,该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。

Qt 使用QDialog::exec()实现应用程序级别的模态对话框,使用QDialog::open()实现窗口级别的模态对话框,使用QDialog::show()实现非模态对话框

模态:

1 void MainWindow::open()
2 {
3     QDialog dialog;
4     dialog.setWindowTitle(tr("Hello"));
5     dialog.exec();
6 }

 

非模态:注意必须用new创建否则一闪而过,这是因为,show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。而用new是建立在堆上,执行完后不会消失。

不过,这样做有一个问题:如果我们的对话框不是在一个界面类中出现呢?由于QWidget的 parent 必须是QWidget指针,那就限制了我们不能将一个普通的 C++ 类指针传给 Qt 对话框。另外,如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,对话框就不会被销毁,所以会一直占用内存。在这种情景下,我们可以设置 dialog 的WindowAttribute

1 void MainWindow::open()
2 {
3     QDialog *dialog = new QDialog;
4     dialog->setAttribute(Qt::WA_DeleteOnClose);
5     dialog->setWindowTitle(tr("Hello, dialog!"));
6     dialog->show();
7 }

 

对话框Dialog

标签:

原文地址:http://www.cnblogs.com/raichen/p/5066522.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!