Qt 模态对话框和非模态对话框
模态对话框和非模态对话框
模态对话框和⾮模态对话框Windows对话框分为两类:模态对话框和⾮模态对话框。
模态对话框,当它弹出后,本应⽤程序其他窗⼝将不再接受⽤户输⼊,只有该对话框响应⽤户输⼊,在对它进⾏相应操作退出后,其他窗⼝才能继续与⽤户交互。
(⽐如:word中的“另存为”)⾮模态对话框,它弹出后,本程序其他窗⼝仍能响应⽤户输⼊。
⾮模态对话框⼀般⽤来显⽰提⽰信息等。
(⽐如:word中的“查找与替换)创建模态对话框弹出对话框⽐较关键的⼀个函数,CDialog::DoModal()函数的原型为:virtual INT_PTR DoModal(); 返回值:整数值,指定了传递给CDialog::EndDialog(该函数⽤于关闭对话框)的nResult参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
调⽤了它对话框就会弹出,返回值是退出对话框时所点的按钮的ID,⽐如,我们点了“退出”按钮,那么DoModal返回值为IDCANCEL。
就是对话框类的DoModal()函数。
注:CAdditionDlg 为新建对话框的类。
CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal(); // 弹出对话框dlg,并将DoModal函数的返回值(退出时点击按钮的ID)赋值给nResponseif (nResponse == IDOK) // 判断返回值是否为OK按钮{MessageBox(“ ”,””,MB_OK);}else if (nResponse == IDCANCEL) // 判断返回值是否为Cancel按钮{MessageBox(“ ”,””,MB_OK);}步骤:1. 在资源视图添加Dialog的对话框,再给对话框添加类CAdditionDlg。
2. 定义对话框类的对象CAdditionDlg m_dlg。
用户界面设计知识:如何在用户界面设计中运用对话框和模态窗口
用户界面设计知识:如何在用户界面设计中运用对话框和模态窗口近年,软件界面设计已成为软件设计的一个重要组成部分。
用户界面设计就是设计软件对终端用户的外观、互动和使用方便性。
如何在界面设计中运用对话框和模态窗口是一个非常重要的问题。
因为对话框和模态窗口是常见的用户反馈方式,设计合理的对话框和模态窗口可以使用户更容易理解软件的功能,更方便地使用软件。
本文将分析对话框和模态窗口的概念、属性及优点,从而指导如何在用户界面设计时运用对话框和模态窗口。
一、对话框的概念1.1对话框的定义对话框是在软件界面中打开的一个窗口,它通常用于让用户与程序进行交互。
对话框常常在软件开发过程中被广泛应用。
对话框最常用的方式是在打开一个文件时,请用户选择一个文件或输入一个文件名,然后在关闭对话框之前完成操作。
因此,对话框是一组程序和用户之间的交流。
1.2对话框的种类对话框可以分为模态对话框和非模态对话框。
模态对话框指的是当对话框打开时,用户无法在下面的窗口中操作。
非模态对话框指的是即使非模态对话框打开,用户也可以在底层窗口中进行操作。
因此,设计人员可以根据实际需要选择使用哪种类型的对话框。
二、对话框运用2.1对话框的优点对话框具有很多优点。
首先,对话框通常可以更好地组织软件界面。
在软件操作过程中,各种功能键及按钮频繁出现,程序变得复杂且难以使用。
而使用对话框,可以把功能集中到一个程序中,减轻程序复杂度,从而提高程序的整体可读性,使用户使用起来更加方便。
其次,对话框能够提供多种选择。
对话框可以提供给用户多个选项,用户可以根据自己的需求灵活选择。
例如,选项卡对话框能够提供多种功能选项,用户可以根据自己的需要选择功能,这样就能更好地实现软件自我定制并满足不同用户的需求。
对话框还可以用于程序开发中的错误处理,一旦程序发生错误,对话框会提示用户具体错误情况,从而避免用户由于不了解错误原因而继续操作导致更多错误的发生。
这种机制还可以避免程序崩溃的发生,保证程序的可靠性。
QT模态对话框及非模态对话框
QT模态对话框及⾮模态对话框QT模态对话框及⾮模态对话框模态对话框(Modal Dialog)与⾮模态对话框(Modeless Dialog)的概念不是所独有的,在各种不同的平台下都存在。
⼜有叫法是称为模式对话框,⽆模式对话框等。
所谓模态对话框就是在其没有被关闭之前,⽤户不能与同⼀个应⽤程序的其他窗⼝进⾏交互,直到该对话框关闭。
对于⾮模态对话框,当被打开时,⽤户既可选择和该对话框进⾏交互,也可以选择同应⽤程序的其他窗⼝交互。
在Qt中,显⽰⼀个对话框⼀般有两种⽅式,⼀种是使⽤exec()⽅法,它总是以模态来显⽰对话框;另⼀种是使⽤show()⽅法,它使得对话框既可以模态显⽰,也可以⾮模态显⽰,决定它是模态还是⾮模态的是对话框的modal属性。
在Qt中,Qt的模态与⾮模态对话框选择是通过其属性modal来确定的。
我们来看看modal属性,其定义如下:modal : bool默认情况下,对话框的该属性值是false,这时通过show()⽅法显⽰的对话框就是⾮模态的。
⽽如果将该属性值设置为true,就设置成了模态对话框,其作⽤于把QWidget::windowModality属性设置为Qt::ApplicationModal。
⽽使⽤exec()⽅法显⽰对话框的话,将忽略modal属性值的设置并把对话框设置为模态对话框。
⼀般使⽤setModal()⽅法来设置对话框的modal属性。
我们总结⼀下设置对话框为模态的⽅法。
◆如果要设置为模态对话框,最简单的就是使⽤exec()⽅法,⽰例代码如下:MyDialog myDlg; myDlg.exec();也可以使⽤show()⽅法,⽰例代码如下:MyDialog myDlg; myDlg.setModal(true); myDlg.show();◆如果要设置为⾮模态对话框,必须使⽤show()⽅法,⽰例代码如下:MyDialog myDlg; myDlg.setModal(false);//或者myDlg.setModal();myDlg.show();再次强调,⽬前有的朋友对于模态对话框和⾮模态对话框的认识有误解,认为使⽤show()⽅法显⽰的就是⾮模态对话框,这是不正确的。
pyside qdialog用法
pyside qdialog用法Pyside QDialog用法详解:实现自定义对话框随着GUI应用程序的不断发展,对话框成为了GUI设计中不可或缺的一部分。
在Python中,可以使用Pyside库来实现各种功能强大的对话框。
本文将介绍Pyside中QDialog的用法,并详细解释如何创建自定义对话框。
一、什么是QDialogQDialog是Pyside库中的一个窗口部件类,用于显示对话框。
对话框是一种特殊的窗口,用于与用户进行短期交互。
QDialog具有可继承性,可以根据自己的需要进行自定义,满足不同的应用场景。
二、QDialog的特点与用途1. 模态与非模态QDialog可以被设置为模态窗口(Modal)或非模态窗口(Modeless)。
模态对话框意味着用户必须先完成对话框的操作才能返回到主窗口,而非模态对话框则允许用户同时对主窗口和对话框进行操作。
2. 内建按钮QDialog内建了一些常见的按钮,如"确认"、"取消"、"应用"等,方便开发者快速添加常用的按钮,并响应按钮点击事件。
三、创建一个简单的QDialog下面我们来演示如何创建一个简单的QDialog并显示一个包含文本标签的对话框。
pythonfrom PySide2.QtWidgets import QDialog, QLabelclass CustomDialog(QDialog):def __init__(self, parent=None):super(CustomDialog, self).__init__(parent)self.setWindowTitle("自定义对话框")self.setGeometry(100, 100, 300, 200)label = QLabel("这是一个自定义对话框!", self)label.move(50, 50)在上述代码中,我们首先导入了QDialog和QLabel,然后创建了一个名为CustomDialog的自定义对话框类。
mfc模态和非模态对话框编程
MFC模态和非模态对话框编程1. CDialog是从CWnd派生的。
对话框有两种类型:模态和非模态。
★模态和非模态区别:当我们显示一个模态对话框时,应用程序会暂停,即点击其他菜单或者别的不会执行,会出现警告的那种声音。
直到关闭模态对话框,应用程序才会继续执行其他任务。
2. 在创建好一个新的对话框时,系统会已定义好2个方法。
● 构造函数:调用父类的构造函数,传入自己的IDD● DoDataExchange:完成对话框数据的交换和校验3. 模态对话框的显示和关闭CDialog::DoModal和CDialog::EndDialog程序示例:void CMyboleView::OnDiadlog(){// TODO: Add your command handler code hereCTestDlg dlg;dlg.DoModal();}4. 非模态对话框的创建CDialog::CreateBOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );默认参数为NULL,就是父窗口是框架类。
程序示例:void CMyboleView::OnDiadlog(){// TODO: Add your command handler code hereCTestDlg dlg;dlg.Create(IDD_DIALOG1,this);dlg.ShowWindow(SW_SHOW);}PS:注意要用ShowWindow显示对话框。
问题:程序执行后,对话框还是没显示出来。
为什么?这里的CTestDlg dlg;我们是定义成局部变量的。
但是当这个函数执行完了,就会销毁dlg 的。
那为什么模态可以呢?这就是刚才我们说的创建模态对话框时,程序会暂停在那的原因导致的。
Qt模态对话框和非模态对话框
Qt模态对话框和⾮模态对话框
⼀、模态对话框
Qt 中使⽤QDialog类实现对话框。
我们的对话框通常继承⾃QDialog。
对话框分为模态对话框和⾮模态对话框。
所谓模态对话框,就是会阻塞同⼀应⽤程序中其它窗⼝的输⼊。
Qt使⽤QDialog::exec()来实现模态对话框。
如下所⽰:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
QDialog dialog;
dialog.exec();
}
如果不关闭Dialog窗⼝,那么就⽆法操作下⾯的MainWindow窗⼝。
这就是模态对话框。
⼆、⾮模态对话框
⾮模态对话框就是在打开它的时候,我们仍旧能够操作其它的窗⼝。
Qt使⽤QDialog::show()来创建⾮模态对话框。
QDialog *dialog = new QDialog;
dialog->show();
dialog->setAttribute(Qt::WA_DeleteOnClose); //在关闭窗⼝的时候释放内存
⾮模态对话框,如果我们创建在栈上,那么它会⼀闪⽽过(除⾮它是全局的或者静态的)。
因此我们将它创建在堆上,
即使这样我们也不能去释放它,否则他也是⼀闪⽽过。
那么随着每次操作都会有内存泄漏。
为了避免这⼀点,
Qt提供了⼀个setAttribute函数来设置可以在关闭它的时候释放内存。
参考:。
讲座四 VS2010(MFC)编程--几种常见对话框
VS2010(MFC)编程--几种对话框VS2010/MFC编程:模态对话框及其弹出过程加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益。
趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎样弹出。
一.模态对话框和非模态对话框Windows对话框分为两类:模态对话框和非模态对话框。
模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。
非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。
非模态对话框一般用来显示提示信息等。
大家对Windows系统很了解,相信这两种对话框应该都遇到过。
之前的加法计算器对话框其实就是模态对话框。
二.模态对话框是怎样弹出的毕竟加法计算器程序大部分都是MFC自动生成的,对话框怎么弹出来的大家可能还不是很清楚。
下面简单说说它是在哪里弹出来的,再重新建一个新的对话框并弹出它,这样大家实践以后就能更灵活的使用模态对话框了。
大家打开Addition.cpp文件,可以看到CAdditionApp类有个InitInstance()函数,在MFC应用程序框架分析中提到过此函数,不过那是单文档应用程序App类中的,函数体不太相同,但都是进行App类实例的初始化工作。
InitInstance()函数的后半部分有一段代码就是定义对话框对象并弹出对话框的,下面给出这段代码并加以注释:C++代码弹出对话框比较关键的一个函数,就是对话框类的DoModal()函数。
CDialog::DoModal()函数的原型为:virtual INT_PTR DoModal();返回值:整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框)的nResult 参数值。
如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
c#中的模态对话框和非模态对话框
c#中的模态对话框和⾮模态对话框模态对话框弹出窗⼝阻⽌调⽤窗⼝的所有消息响应。
只有在弹出窗⼝结束后调⽤窗⼝才能继续。
在模态窗⼝“关闭”后,可以读取模态窗⼝中信息,包括窗⼝的返回状态,窗⼝⼦控件的值。
⾮模态对话框可以在弹出窗⼝和调⽤窗⼝之间随意切换。
调⽤窗⼝调⽤show⽅法后,下⾯的代码可以⽴即执⾏。
在⾮模态窗⼝关闭后,窗⼝的所有资源被释放,窗⼝不存在,⽆法获取窗⼝的任何信息。
所谓模态对话框,就是指除⾮采取有效的关闭⼿段,⽤户的⿏标焦点或者输⼊光标将⼀直停留在其上的对话框。
⾮模态对话框则不会强制此种特性,⽤户可以在当前对话框以及其他窗⼝间进⾏切换概念说明1 模态窗⼝打开模态窗⼝后,只要不关闭该窗⼝,⿏标焦点或者光标就会⼀直停留在该窗⼝上。
只有关闭该窗⼝后,调⽤窗⼝才能继续。
模态窗⼝关闭后,仍可以读取模态窗⼝中的信息,如窗⼝的返回状态等。
2 ⾮模态窗⼝打开⾮模态窗⼝后,仍可以操作调⽤窗⼝。
关闭⾮模态窗⼝,该窗⼝将不复存在,会释放窗⼝的所有资源,所以⽆法得到该窗⼝的任何信息。
实例说明1 建⽴Windows窗体程序ShowAndShowDialogExp,程序主画⾯包含两个按钮,⽤于打开模态窗⼝和⾮模态窗⼝(如下图所⽰)。
2 编写按钮的Click事件代码private void button1_Click(object sender, EventArgs e){Form frm1 = new Form();frm1.Text = "我是模态窗⼝!";frm1.ShowDialog();//打开模态窗⼝(对话框)}private void button2_Click(object sender, EventArgs e){Form frm2 = new Form();frm2.Text = "我是⾮模态窗⼝!";frm2.Show();//打开⾮模态窗⼝(对话框)}3 运⾏代码,进⾏操作体验点击按钮“打开模态窗⼝”,打开模态窗⼝frm1,窗⼝标题栏显⽰“我是模态窗⼝!”,此时⽆法切换到调⽤窗⼝,当关闭该窗⼝后,⼜可以继续操作调⽤窗⼝了。
Qt基础教程之自定义对话框及调用方法
在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。
自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。
对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。
本节将通过实例 samp6_2 来详细介绍这些原理。
图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。
图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点:•设置表格行列数对话框 QWDialogSize该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。
这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。
•设置表头标题对话框 QWDialogHeaders图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。
图 2 设置表格表头标题对话框注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。
这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。
下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。
•单元格定位与文字设置对话框QWDialogLocate图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。
QT学习之对话框(四)字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
QT学习之对话框(四)字体对话框、消息对话框、⽂件对话框、进程对话框(超详细中⽂注释)QMessageBox类:含有Question消息框、Information消息框、Warning消息框和Critical消息框等通常有两种⽅式可以来创建标准消息对话框:⼀种是采⽤“基于属性”的API,⼀种是使⽤QMessageBox的静态⽅法。
后者书写容易,但缺少灵活性,针对⽤户给出的提⽰的信息不够丰富,并且不能⾃定义消息对话框⾥⾯的按钮提⽰信息。
因此推荐第⼀种写法。
[cpp]1. <span style="font-size:18px;">#include <QMessageBox>2.3. void MessageShow()4. {5. QMessageBox::StandardButton reply; // 枚举型变量6. reply = QMessageBox::critical(this,tr("QMessageBox::cirtical()"), //有critical question information warning类型的消息对话框7. MESSAGE,QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore);8. // 此类按钮还有如 OK HELP Yes No等等9. if(reply == QMessageBox::Abort)10. {11. criticalLabel->setText(tr("Abort"));12. }13. else if(reply == QMessageBox::Retry)14. {15. criticalLabel->setText(tr("Retry"));16. }17. else18. {19. criticalLabel->setText(tr("Ignore"));20. }21. } </span>这个例⼦是使⽤AMessageBox类的静态⽅法,后⾯的例⼦中就是采⽤“基于属性”的API⽅法。
对话框程序-3
默认按钮
• 一个对话框的默认按钮就是按下Enter键后被按下的按钮. 这个按钮通常用于显示用户接受了对话框的设置,并希望关 闭该对话框. 使用函数 • QPushButton::setDefault(), QPushButton::isDefault() QPushButton::autoDefault() • 来设置和控制对话框的默认按钮.
27
QT的调色板类QPalette
• 可以通过QWidget::palette()获取一个窗口部件的调色板, 然后通过QWidget::setPalette()函数为该窗口部件设置修改 后的调色板。或者通过QApplication::palette()函数获取应用 程序的调色板,并通过QApplication::setPalette()为该程序 设置修改后的调色板。
12
模态对话框的可延展性 • 模态对话框通常用于需要有返回值的情况.例如,指 示用户是按下OK还是Cancel。一个对话框可以通 过调用连接槽函数accept()或reject()来关闭,然后 exec()会返回相应的值Accepted或Rejected。 • exec()调用会返回对话框的选择结果。如果对话框 没有销毁,也可以从函数result()中获得。 • 为了修改对话框关闭时的行为,你可以重新实现 函数accept(), reject()或done(). 而函数closeEvent() 函数仅仅在需要保存对话框的位置时重新实现。
29
QT的调色板类QPalette • 调色板类Qpalette提供了颜色概念,是指当前GUI 界面中颜色的职责,通过枚举变量 Qpalette::ColorRole来定义,比较常用的颜色角色 有: • Qpalette::Window,通常指窗口部件的背景色 • Qpalette::WindowText,通常指窗口部件的前景色 • Qpalette::Base,指文本输入窗口部件的背景色 • Qpalette::Text,与Qpalette::Base一块使用,指文本 输入窗口部件的前景色
模态、非模态 MFC 调用一个新的 对话框
调用一个新的对话框的方法注意:这里是插入窗体。
一、模态对话框1) 首先,新建的一个对话框,假如为test2) 在刚才插入的子窗口添加消息映射函数void C***Dll::PostNcDestroy() ,在次函数里面添加:delete this;3) 在需要调用新建对话框的CPP 文件添加头文件#include "test.h"4) 然后在需要调用新建对话框的按钮的成员函数里写上:AFX_MANAGE_STATE(AfxGetStaticModuleState());test testDlg;testDlg.DoModal();二、非模态对话框1) 首先,插入一个窗体,假如为CFrmDl ;2) 在刚才插入的子窗口添加消息映射函数void C***Dll::PostNcDestroy() ,在次函数里面添加:delete this;3) 在需要调用新建对话框的CPP 文件添加头文件#include "FrmDll.h" ;4) 然后在需要调用新建对话框的按钮的成员函数里写上:AFX_MANAGE_STATE(AfxGetStaticModuleState());CFrmDll *dlg = new CFrmDll; // 在内存中new 出来dlg->Create(IDD_FRMDLLDlg); // 创建对话框,dlg->CenterWindow(); // 窗口居中dlg->ShowWindow(SW_SHOW); // 显示窗口非模态Dll 调用例子:typedef void ( * P_show)();HINSTANCE hinstance =NULL;void CTestDlgDlg::OnButton1(){if (hinstance ==NULL){hinstance = LoadLibrary ("dllPro.dll");}if(hinstance ==NULL){AfxMessageBox("Fail");return;}P_show show = (P_show)::GetProcAddress (hinstance,"showdlg");show();// FreeLibrary(hinstance); // 这个记得放在析构函数里面// hinstance = NULL; // 这个记得放在析构函数里面}。
模态对话框与非模态对话框的区别
模态对话框与非模态对话框的区别使用非模态对话框与使用模态对话框相似,但是也有一些重要的区别:首先,非模态对话框通常包含一个标题列和一个系统菜单按钮。
当您在Developer Studio中建立对话框时,这些是内定选项。
用于非模态对话框的对话框模板中的STYLE叙述形如:STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE标题列和系统菜单允许使用者,使用鼠标或者键盘将非模态对话框移动到另一个显示区域。
对于模态对话框,您通常无须提供标题列和系统菜单,因为使用者不能在其下面的窗口中做任何其它的事情。
第二项重要的区别是:注意,在我们的范例STYLE叙述中包含有WS_VISIBLE样式。
在 Developer Studio中,从「Dialog Properties」对话框的「More Styles」页面卷标中选择此选项。
如果省略了WS_VISIBLE,那么您必须在CreateDialog呼叫之后呼叫ShowWindow:(这一个是对于非模态的对话框而言的)hDlgModeless = CreateDialog ( . . . ) ; ShowWindow (hDlgModeless, SW_SHOW) ;如果您既没有包含WS_VISIBLE样式,又没有呼叫ShowWindow,那么非模态对话框将不会被显示。
如果忽略这个事实,那么习惯于模态对话框的程序写作者在第一次试图建立非模态对话框时,经常会出现问题。
第三项区别:与模态对话框和消息框的消息不同,非模态对话框的消息要经过程序式的消息队列。
要将这些消息传送给对话框窗口消息处理程序,则必须改变消息队列。
方法如下:当您使用CreateDialog建立非模态对话框时,应该将从呼叫中传回的对话框句柄储存在一个整体变量(如hDlgModeless)中,并将消息循环改变为:while (GetMessage (&msg, NULL, 0, 0)){if (hDlgModeless == 0 ||!IsDialogMessage (hDlgModeless, &msg)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}}如果消息是发送给非模态对话框的,那么IsDialogMessage将它发送给对话框中窗口消息处理程序,并传回TRUE(非0);否则,它将传回FALSE(0)。
QT常用控件(一)——菜单栏和对话框
QT常⽤控件(⼀)——菜单栏和对话框引⾔QMainWindow 是⼀个为⽤户提供主窗⼝程序的类,包含⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个锚接部件(dock widgets)、⼀个状态栏(status bar)及⼀个中⼼部件(central widget),是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。
(本篇主要介绍菜单栏和⼯具栏)⼀个主窗⼝最多只有⼀个菜单栏。
位于主窗⼝顶部、主窗⼝标题栏下⾯。
创建菜单栏。
QMenuBar* menuBar = new QMenuBar(this);创建菜单,调⽤ QMenu 的成员函数 addMenu 来添加菜单QAction* addMenu(QMenu * menu)QMenu* addMenu(const QString & title)QMenu* addMenu(const QIcon & icon, const QString & title)创建菜单项,调⽤ QMenu 的成员函数 addAction 来添加菜单项QAction* activeAction()QAction* addAction(const QString & text)QAction* addAction(const QIcon & icon, const QString & text)QAction* addAction(const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0)QAction* addAction(const QIcon & icon, const QString & text, const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)实例演⽰:(vs2019+qt5)//创建菜单栏QMenuBar* menuBar = new QMenuBar(this);//创建菜单(⽤addMenu⽅法添加⼊菜单栏)QMenu* filename = menuBar->addMenu(QStringLiteral("⽂件(&F)"));//创建菜单项QAction* openfile = new QAction(QStringLiteral("打开⽂件(&O)"));QAction* opendlg = new QAction(QStringLiteral("打开对话框(&D)"));//给菜单项添⼊图标openfile->setIcon(QIcon(":/D:/image/Luffy.png"));opendlg->setIcon(QIcon(":/D:/image/LuffyQ.png"));//⽤addAction加⼊菜单项filename->addAction(opendlg);filename->addAction(openfile);注意:使⽤ QStringLiteral 宏可以在编译期把代码⾥的常量字符串 str 直接构造为 QString 对象,于是运⾏时就不再需要额外的构造开销了。
第11章 模态和非模态对话框
11.4.1 属性表对话框的创建
• 为了支持属性表对话框,MFC提供了 CPropertySheet类和CPropertyPage类。前者代表 对话框的框架,后者代表对话框中的某一页。 CPropertyPage是CDialog类的派生类,而 CPropertySheet是CWnd类的派生类。虽然 CPropertySheet不是CDialog类的派生类,但使用 CPropertySheet对象的方法与使用CDialog对象是 类似的。
11.5.3 文件对话框
• CFileDialog类用于实现文件选择对话框,以支持 文件的打开和保存操作。用MFC AppWizard建立的 文档/视图结构的应用程序中自动加入了文件选择 对话框,在文件菜单中执行“打开”或“另存为” 命令会启动它们。
11.5.4 字体对话框
• CFontDialog类支持字体对话框,用来让用户选择 字体。(具体内容请参照本书)
Байду номын сангаас第11章 对话框的应用
• 对话框是Windows应用程序中最重要的用户界面元 素之一,它是通过对话框上的各种控件来和用户 进行交互的。本章将详细介绍对话框的一般创建 流程,模态和非模态对话框的创建与使用以及属 性表对话框和公用对话框的使用方法。
11.1 对话框的工作方式、种类和创建方 法
• 与前面介绍的菜单、快捷键、图标、光标等界面 元素一样,对话框也是Windows程序的一种资源, 称作对话框模板。本节将详细介绍对话框在程序 中的工作方式、种类以及对话框模板的创建与编 辑。
11.2.2 为对话框类添加成员变量
• 要使对话框能与程序通讯,还需给对话框类增加 数据成员,以保存各控件的初始值,并从控件读 取数据。 • 与控件对应的数据成员有两种类型:变量类型和 控件类型。
QT+模态对话框与非模态对话框
QT+模态对话框与⾮模态对话框#include "mainwindow.h"#include <QMenuBar>#include <QMenu>#include <QAction>#include <QDialog>#include<QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent){QMenuBar *mBar = menuBar();setMenuBar(mBar);QMenu *menu = mBar->addMenu("对话框");//模态QAction *p1 = menu->addAction("模态对话框");connect(p1,&QAction::triggered,[=](){QDialog dlg;dlg.exec();qDebug()<<"111111";});//⾮模态QAction *p2 = menu->addAction("⾮模态对话框");connect(p2,&QAction::triggered,[=](){/*使⽤如下代码的时候,会发现其窗⼝会⼀闪⽽过,这是因为这种⽅式是局部变量的⽅式,其顺序执⾏,并释放内存,所以就会⼀闪⽽过。
* QDialog dlg;* dlg.show();* qDebug()<<"111111";**//*为了防⽌其⼀闪⽽过,将其定义为成员变量* 这种使⽤全局变量的⽅式,是最简单的,不⽤考虑内存泄漏的问题* 即:将QDialog dlg;声明为全局变量,将其定义在mainwindow.h中类的成员变量。
* 再添加如下代码:* dlg.show();* qDebug()<<"111111";* //*当然了,为了⽅便,如果⾮要使⽤局部变量的话,也是可以的,那就给他动态分配空间* QDialog *p = new QDialog(this);* p->show();* 但是这么写的有⼀个不好的地⽅,这种⽅法创建的窗⼝在程序结束的时候才会释放。
【转】QT创建子对话框的方法
【转】QT创建⼦对话框的⽅法原⽂地址:/baidu_18991997/article/details/42713159代码实现功能:单击某个按钮后,弹出对话框,对话框中的内容可⾃⾏设计。
1.建⽴⼀个主界⾯,主界⾯中有⼀个pushbotton按键。
2.右键项⽬->添加新⽂件->Qt设计师界⾯类Part II——对话框的模态和⾮模态1、建⽴⼀个对话框类:2、对话框中放置pushbutton和TextEdit:3、转到主窗⼝菜单栏New Window的槽:4、在槽中插⼊如下代码(并且在mainwindow.h中要建⽴对话框的指针):5、显⽰结果如下:(1)⾮模态显⽰(dialog->setModal(false)):(2)模态显⽰(dialog->setModal(ture)):给出完整程序(只给出需要填写代码和有注释部分,⽆改动的不给出):mainwindow.h程序:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include"mydialog.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_actionNew_Window_triggered();private:Ui::MainWindow *ui;MyDialog *dialog; //添加私有成员,为⼀个dailog(窗⼝)的指针};#endif// MAINWINDOW_Hmainwindow.cpp程序:#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);//把给定的组件设定成主窗⼝的中央组件,这⾥是把plainTextEdit设为窗⼝的中央组件 setCentralWidget(ui->plainTextEdit);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_actionNew_Window_triggered(){//新建⼀个窗⼝对象,其中的this指定了新的窗⼝的⽗对象是MainWindow,在销毁Mainwindow时也会销毁⼦对象,即该窗⼝对象 dialog = new MyDialog(this);//Modal属性决定了show()应该将弹出的dialog设置为模态还是⾮模态//默认情况下该属性为false并且show()弹出的窗⼝是⾮模态的//把这个属性设置为true就详单与设置QWidget::windowModality为Qt::ApplicationModal//执⾏exec()忽略这个Modal这个属性,并且把弹出的dialog设置为模态的dialog->setModal(false); //此处ture为模态,false为⾮模态dialog->show();}main.cpp程序://2014/8/3 wayne HDU//问题描述:(1)创建⼀个mainwindow(2)创建⼀个dialog,并且展⽰modal和modaless的区别#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);MainWindow w;w.show();return a.exec();Part II——对话框的模态和⾮模态1、建⽴⼀个对话框类:2、对话框中放置pushbutton和TextEdit:3、转到主窗⼝菜单栏New Window的槽:4、在槽中插⼊如下代码(并且在mainwindow.h中要建⽴对话框的指针):5、显⽰结果如下:(1)⾮模态显⽰(dialog->setModal(false)):(2)模态显⽰(dialog->setModal(ture)):给出完整程序(只给出需要填写代码和有注释部分,⽆改动的不给出):mainwindow.h程序:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include"mydialog.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_actionNew_Window_triggered();private:Ui::MainWindow *ui;MyDialog *dialog; //添加私有成员,为⼀个dailog(窗⼝)的指针};#endif// MAINWINDOW_Hmainwindow.cpp程序:#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);//把给定的组件设定成主窗⼝的中央组件,这⾥是把plainTextEdit设为窗⼝的中央组件setCentralWidget(ui->plainTextEdit);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_actionNew_Window_triggered(){//新建⼀个窗⼝对象,其中的this指定了新的窗⼝的⽗对象是MainWindow,在销毁Mainwindow时也会销毁⼦对象,即该窗⼝对象 dialog = new MyDialog(this);//Modal属性决定了show()应该将弹出的dialog设置为模态还是⾮模态//默认情况下该属性为false并且show()弹出的窗⼝是⾮模态的//把这个属性设置为true就详单与设置QWidget::windowModality为Qt::ApplicationModal//执⾏exec()忽略这个Modal这个属性,并且把弹出的dialog设置为模态的dialog->setModal(false); //此处ture为模态,false为⾮模态dialog->show();}main.cpp程序://2014/8/3 wayne HDU//问题描述:(1)创建⼀个mainwindow(2)创建⼀个dialog,并且展⽰modal和modaless的区别#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);MainWindow w;w.show();return a.exec();。
Qt专栏之模态与非模态对话框的实现
Qt专栏之模态与⾮模态对话框的实现⼀、概念介绍什么是模态对话框和⾮模态对话框呢?我们⽇常使⽤软件过程中很常见的现象,点击某个软件上某个按钮会弹出对话框窗⼝,此时对于其他窗⼝⽽⾔:可以同时对其他窗⼝进⾏操作的称为⾮模态;不可以同时,只能操作当前弹出的窗⼝的称为模态。
⼆、代码⽰例2.1模态对话框⽰例代码/*在主类对象的构造函数中我们新建⼀个按钮⽤于弹出对话框*/QPushButton *btn = new QPushButton("new",this);/*信号与槽的连接槽函数通过Lambda表达式实现主要功能实现了点击⼀个new按钮,弹出⼀个模态对话框*/connect(btn,&QPushButton::clicked,[=](){QDialog dlg(this) ;dlg.exec();});注意包含头⽂件QPushButton以及QDialog2.2⾮模态对话框⽰例代码/*在主类对象的构造函数中我们新建⼀个按钮⽤于弹出对话框*/QPushButton *btn = new QPushButton("new",this);/*信号与槽的连接,槽函数通过Lambda表达式实现主要功能实现了点击⼀个new按钮,弹出⼀个⾮模态对话框*/connect(btn,&QPushButton::clicked,[=](){QDialog *dlg = new QDialog(this) ;dlg->show();});很好奇,为什么是对话框,上⾯模态直接QDialog dlg(this);⽽⾮模态就需要new呢?那是因为构造函数中在栈中声明定义的变量在构造函数运⾏完成后,就会被回收。
因此,new⼀个对象实例,利⽤堆上的空间即可,可以试试两种实现效果的不同,这边我们演⽰的效果如下:三、⾮模态下的内存泄漏隐患假设⼀下,在我们上述的⾮模态场景下,点击按钮new⼀个对象⽰例后,我们关掉对话框,由于使⽤堆空间,只要主窗⼝QObject未被析构回收内存,继续点击按钮就会⼜创建⼀个新的对象实例,循环反复⼀直创建到达⼀定数量级,就会导致堆溢出。
QT非模式对话框和模式对话框
QT⾮模式对话框和模式对话框
重点讲述模式对话框,以及exec()的⽤法,accept()和accepted的概念。
⼀、⾮模式对话框
⾮模式对话框是和同⼀个程序中其它窗⼝操作⽆关的对话框。
调⽤show()来显⽰⾮模式对话框。
show()⽴即返回,这样调⽤代码中的控制流将会继续。
⾮模式对话框,说⽩了,就像你打开了好⼏个QQ聊天窗⼝,每个聊天窗⼝都是⼀个⾮模式对话框,想和谁聊和谁聊,只要点击那个窗⼝就可以输⼊聊天信息进⾏发送了。
⼆、模式对话框
模式对话框就是阻塞同⼀应⽤程序中其它可视窗⼝的输⼊的对话框:⽤户必须完成这个对话框中的交互操作并且关闭了它之后才能访问应⽤程序中的其它任何窗⼝。
⽤来让⽤户选择⼀个⽂件或者⽤来设置应⽤程序参数的对话框通常是模式的。
调⽤exec()来显⽰模式对话框。
当⽤户关闭这个对话框,exec()将提供⼀个可⽤的返回值并且这时流程控制继续从调⽤exec()的地⽅进⾏。
通常,我们连接默认按钮,例如“OK”到accept()槽并且把“Cancel”连接到reject()槽,来使对话框关闭并且返回适当的值。
另外我们也可以连接done()槽,传递给它Accepted或Rejected。
accept()的作⽤是:将当前的窗⼝隐藏(这样就做到⼦窗⼝功能消失这个功能),并且发送accepted信号,也就是设置设置结果代码为Accepted。
QDialog的accept()函数和reject()函数
这两个函数作⽤分别是:都能够隐藏QDialog,但是返回值不同,⼀个是Accepted,⼀个是Rejected,
返回值不同的作⽤是:区分⽤户按下的OK按钮,还是Cancel按钮。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解 Qt 模态对话框和非模态对话框
2011-07-01 11:33 佚名互联网我要评论(0)字号:T | T
如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。
AD:Qt 模态对话框和非模态对话框是本文介绍的内容,本文认为本篇是一篇很有意思的文章,不多说,我们先来看内容。
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口。
非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框。
如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;模态对话框则不是阻塞型的线程模型,父子线程可以并行运行。
和所有流行的图形类库一样,Qt也提供了创建模态和非模态对话框的机制。
在Qt中创建模态对话框,主要用到了QDialog的exec函数:
1.SonDialog dlg(this);
2.int res = dlg.exec();
3.if (res == QDialog::Accepted)
4.{
5. QMessageBox::information(this, "INFORMATION", "You clicked OK bu
tton!");
6.}
7.if (res == QDialog::Rejected)
8.{
9. QMessageBox::information(this, "INFORMATION", "You clicked CANCE
L button!");
10.}
正如上面代码所显示的,可以通过exec函数的返回值来判断用户点击了哪个按钮使得模态对话框退出的,这可以使得我们能够根据用户的不同行为在推出退出模态对话框之后采
取不同的处理方法。
在Qt中创建非模态对话框,主要用到了QDialog的show函数:
1.SonDialog *dlg;
2.dlg = new SonDialog(this);
3.dlg->show();
由上面代码,细心的读者可能就会问了,既然new了,如果不delete,那么内存不就存在了泄露的问题了吗?确实如此!所以,我们希望该Qt窗口在退出时自动能够delete
掉自己,因此,我们在SonDialog的构造函数里,添加这样的一句代码:
1.setAttribute (Qt::WA_DeleteOnClose);
这样,我们的SonDialog就能够在它退出时自动的delete掉自己了,不会再造成内存泄漏问题。
小结:关于Qt 模态对话框和非模态对话框的内容介绍完了,希望本文对你有所帮助!。