目录
使用QMessageBox显示消息框(特殊类型的模态对话框)
在Qt中,QDialog是所有对话框窗口类的基类,不只是对话框有模态与非模态区分,QWidget和QMainWindow窗口也可以设为模态,因此文章不称模态/非模态对话框,而叫做模态/非模态窗口。
打开对话框
在Qt中,打开对话框通常是通过创建对话框的实例并调用其exec()或show()方法来实现的。这里有两种主要类型的对话框:模态对话框和非模态对话框。
模态对话框
模态对话框会阻塞用户与同一应用程序其他窗口的交互,直到对话框被关闭。要使用模态对话框,可以使用QDialog类或其子类(如QMessageBox)的exec()方法。
#include <QApplication> #include <QDialog> #include <QPushButton> #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个对话框 QDialog dialog; dialog.setWindowTitle("模态对话框示例"); // 创建一个按钮并设置其点击行为 QPushButton *button = new QPushButton("关闭", &dialog); QObject::connect(button, &QPushButton::clicked, &dialog, &QDialog::accept); // 设置对话框的布局 QVBoxLayout *layout = new QVBoxLayout(&dialog); layout->addWidget(button); dialog.setLayout(layout); // 显示对话框,这会阻塞其他窗口的交互 dialog.exec(); return app.exec(); } |
非模态对话框
非模态对话框允许用户与应用程序的其他部分同时交互。要使用非模态对话框,可以使用show()方法而不是exec()。
#include <QApplication> #include <QDialog> #include <QPushButton> #include <QVBoxLayout> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个非模态对话框 QDialog dialog; dialog.setWindowTitle("非模态对话框示例"); dialog.setWindowModality(Qt::NonModal); // 设置为非模态(可选,默认就是非模态) // 创建一个按钮并设置其点击行为(这里使用accept模拟关闭) QPushButton *button = new QPushButton("关闭", &dialog); QObject::connect(button, &QPushButton::clicked, &dialog, &QDialog::accept); // 设置对话框的布局 QVBoxLayout *layout = new QVBoxLayout(&dialog); layout->addWidget(button); dialog.setLayout(layout); // 显示对话框,不会阻塞其他窗口的交互 dialog.show(); //使用show()而不是exec()来显示非模态对话框 return app.exec(); //主窗口的事件循环继续运行,可以与对话框交互 } |
使用QMessageBox
显示消息框(特殊类型的模态对话框)
QMessageBox
是Qt中用于显示消息框的类,它也是一个模态对话框。使用它非常简单。
示例代码
#include <QApplication> #include <QMessageBox> #include <QPushButton> // 虽然在这个例子中不需要,但通常在创建自定义按钮时需要包含此头文件。 #include <QVBoxLayout> // 同上,通常在创建自定义布局时需要。 #include <QDialog> //虽然在这个例子中不需要,但通常在创建自定义对话框时需要包含此头文件。 int main(int argc, char *argv[]) { QApplication app(argc, argv); QMessageBox::information(nullptr, "信息", "这是一个信息框!"); // 显示一个信息框。参数分别是父窗口指针、标题、文本内容。 return app.exec(); // 等待事件处理结束。由于信息框是模态的,这里会阻塞直到信息框被关闭。 } |
在上面的代码中,nullptr作为第一个参数传递给information方法,表示信息框没有父窗口。这样,它会成为一个应用程序级的窗口,而不是依赖于特定的父窗口。如果你想要它依赖于某个特定的父窗口,可以传递那个窗口的指针作为第一个参数。
关闭对话框
在Qt中,关闭对话框通常有几种方式,这取决于你是希望在用户点击某个按钮时关闭对话框,还是在某个事件发生后自动关闭对话框。以下是一些常见的方法:
1. 使用按钮的点击事件
你可以在对话框的按钮(比如QPushButton)的点击事件槽函数中调用QDialog的close()或reject()方法。
void YourDialog::on_closeButton_clicked() { close(); //或者 reject(); } |
2. 使用QDialog的accept()和reject()方法
accept()方法通常用于确认对话框,它会调用QDialog的accept()槽,你可以重写这个槽来执行一些清理工作或关闭对话框。
reject()方法用于取消操作,它会调用QDialog的reject()槽,你也可以重写这个槽来执行一些清理工作或关闭对话框。
void YourDialog::accept() { // 执行一些清理工作 QDialog::accept(); //关闭对话框 } void YourDialog::reject() { // 执行一些清理工作 QDialog::reject(); //关闭对话框 } |
3. 使用QDialog的done()方法
done(int r)方法可以用来结束对话框的执行,并返回一个整数值。如果你想关闭对话框,可以传递一个特定的返回值,通常是QDialog::Accepted或QDialog::Rejected。
void YourDialog::on_closeButton_clicked() { done(QDialog::Accepted); //或者 done(QDialog::Rejected); } |
4. 使用setVisible(false)或hide()方法
如果你只是想隐藏对话框而不是关闭它,可以使用setVisible(false)或hide()方法。这样对话框不会从内存中消失,只是不再可见。如果你想再次显示它,可以使用show()方法。
void YourDialog::on_hideButton_clicked() { setVisible(false); //或者 hide(); } |
模态与非模态的区别
模态(modal)窗口:窗口弹出后,没关闭之前,不可以对同一应用程序的其他窗口进行操作;
非模态(modeless)窗口:窗口弹出后,没关闭之前,可以对同一应用程序的其他窗口进行操作,可以同时和多个窗口进行交互;
模态窗口的实现方法
窗口的show()函数显示的类型是非模态的,有几种方法可以将窗口设为模态,如下:
QDialog对话框
方法1:exec()
QDialog dlg(this); dlg.exec(); // |
– 说明:exec是execute(执行)的缩写,当调用exec()函数时,并不会立即返回,只用当对话框关闭才会返回,因此,只有关闭对话框才会执行后续的代码。
方法2:setModal()
QDialog dlg(this); dlg.setModal(true); //相当于dlg.setWindowModality(Qt::ApplicationModal); dlg.show(); |
说明:设置完模态之后,会执行后续的代码,并不会阻塞。
方法3:setWindowModality()
Qdialog dlg(this); dlg.setWindowModality(Qt::ApplicationModal); dlg.show(); |
- 说明:setWindowModality()的参数设置要阻塞的窗口类型:
枚举值 | 值 | 说明 |
Qt::NonModal | 0 | 非模态,不阻塞任何窗口 |
Qt::WindowModal | 1 | 模态,阻塞它的父窗口、所有的祖先窗口以及他们的子窗口 |
Qt::NonModal | 2 | 模态,阻塞应用程序所有的窗口 |
QWidget和QMainWindow窗口
这两种窗口的模态实现只有上述QDialog中的方法3,即setWindowModality(),不再赘述。
设置置顶非模态窗口
有子窗口和父窗口,要实现子窗口置顶,但是可以对父窗口进行操作,可以在父窗口中进行设置:
subDlg->setParent(this,Qt::Window); |
QWidget窗体设置模态显示
QWidget是Qt中的窗口类,实现QWidget窗口显示有三个步骤。
1.实例化一个窗口类对象(类QWidget的对象可以是QWidget,也可以是QWidget的继承类)
QWidget* pW = new QWidget(NULL);
2.调用函数QWidget::setWindowsModality(Qt::WindowModality windowModality)设置窗口类型,其中Qt::WindowModality windowModality取值如下:
Qt::NonModal 不阻塞(非模态对话框)
Qt::WindowModal 阻塞父窗口,所有祖先窗口及其子窗口(半模态对话框)(没特殊要求的话,一般用这个)
Qt::ApplicationModal 阻塞整个应用程序(模态对话框)
3.调用函数QWidget::show()显示该窗口
QWidget设置模态显示,示例代码如下:
// 示例1
QWidget* pW = new QWidget();
pW->setWindowModality(Qt::ApplicationModal);
pW->show();
// 示例2
QWidget* pW2 = new QWidget(this);
pW2->setWindowModality(Qt::ApplicationModal);
pW2->show();
特别注意:如果要给QWidget窗体设置模态显示,就不能指定父对象。再上述示例中,示例1窗体模态显示,示例2不会显示。
qt中main函数中的exec()作用总结
在qt中的main函数中大家总会看到一个exec()函数的调用方式,一般存在于函数的最后一行用来作为返回使用。
int main(int argc,char * argv[]) { QApplication a(argc,argv); MainWindow w; w.show(); return a.exec(); } |
一般看到的都是用来直接在main函数中进行做返回使用,main函数中做函数返回值都是返回给系统的,所以就明白这个exec()的作用肯定跟系统处理有关。
可以看到main函数传入的两个参数直接被qt的QApplication的a对象进行了接受,这就是main函数开始就把控制权交给了QT了,中间定义一个w对象,并调用自身函数进行显示。然后直接return a.exec()处于一个循环等待事件的状态,接下来就等待接受用户和系统的消息并进行处理,里面就包含所谓的信号槽机制。当应用程序退出时比如调用exit()时,exec()函数的值就会返回。
if(my1.exec()==QDialog::Accepted)
{
xxxxxx具体事件的处理
}
这里也可以看出他就是等待处理一个命令,my1.exec一直循环等待,当跳出来一个对话框,你选择了接受后,那么就进入if里面进行具体事件的处理。
return 0 和return a.exec()进行了对比
那么为什么这里不进行直接return 0 呢,比如像常见的c/c++语言main函数中都是直接return 0 的。其实这里就是qt作为设计界面中心了,直接return 0 就达不到事件循环并显示的效果,程序直接退出了,而exec就是在这里进行了循环一直循环处理着用户和系统的事件。
qt中main函数开始就只是进行一个初始化工作,然后将控制权交给qt,接下来所有事件的处理就只剩下qt的事件循环处理了。
Qt对话框去掉问号按钮
方法一
Qt::WindowFlags flags = Qt::Dialog; flags |= Qt::WindowCloseButtonHint; dlg->setWindowFlags(flags); |
方法二
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint); |
QT界面窗口的显示和隐藏,关闭
1、隐藏窗口
hide() setVisible(false) lower() close() hideEvent() |
介绍
1. hide() 隐藏 隐藏小部件。 此函数等效于 setVisible(false)。 注意:如果您正在使用 QDialog 或其子类并在此函数之后调用 show() 函数,则对话框将显示在其原始位置。 2. setVisible(false) 设置是否可见 true/false,真/假 调用 setVisible(false) 或 hide() 显式隐藏小部件。 一个显式隐藏的小部件永远不会变得可见,即使它的所有祖先都变得可见,除非你显示它。 3. lower() 降低 将小部件降低到父小部件堆栈的底部。 在此调用之后,小部件将在视觉上位于任何重叠的兄弟小部件的后面(因此被遮挡)。 4. close() 关闭 关闭此小部件。 如果小部件已关闭,则返回 true;否则返回假。 首先,它向小部件发送一个 QCloseEvent。如果小部件接受关闭事件,则它会被隐藏。如果它忽略该事件,则不会发生任何事情。 QWidget::closeEvent() 的默认实现接受关闭事件。 如果小部件具有 Qt::WA_DeleteOnClose(widget 属性,使用 void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on = true)) 标志设置和清除,则小部件也会被删除。 (与 hide() 的区别) this->setAttribute(Qt::WA_DeleteOnCLose, true); 无论小部件是否可见,都会将关闭事件传递给小部件。 当具有 Qt::WA_QuitOnClose 属性集的最后一个可见主窗口(即没有父窗口)关闭时,会发出 QApplication::lastWindowClosed() 信号。默认情况下,为所有小部件设置此属性,但瞬态窗口除外,例如启动屏幕、工具窗口和弹出菜单。 5. hideEvent() 隐藏事件 当 Qt 从窗口系统接收到对顶级窗口部件的窗口关闭请求时,使用给定事件调用此事件处理程序。 默认情况下,接受事件并关闭小部件。 您可以重新实现此函数以更改小部件响应窗口关闭请求的方式。例如,您可以通过对所有事件调用 ignore() 来阻止窗口关闭。 |
显示窗口
1. show() 2. setVisible(true) 3. raise() 4. exec() 5. showEvent() |
1. show() 显示 显示小部件及其子小部件。 这相当于调用 showFullScreen()、showMaximized() 或 setVisible(true),具体取决于平台对窗口标志的默认行为。 2. setVisible(true) 设置是否可见 true/false,真/假 如果直到窗口的所有父小部件都可见,则调用 setVisible(true) 或 show() 将小部件设置为可见状态。 如果祖先不可见,则小部件将在其所有祖先都显示之前不会变为可见。 如果它的大小或位置发生了变化,Qt 保证一个小部件在它显示之前得到移动和调整大小事件。 如果小部件尚未调整大小,Qt 将使用 adjustSize() 将小部件的大小调整为有用的默认值。 碰巧被屏幕上的其他窗口遮挡的小部件被认为是可见的。 3. raise() 提高 将此小部件提升到父小部件堆栈的顶部。 在此调用之后,小部件将在视觉上位于任何重叠的同级小部件的前面。 4. exec() int QDialog::exec() 显示的只能是 模态窗口,且只要去关闭窗口,操作权会一直在该窗口,开启事件循环,用户关闭它之前一直处于阻塞状态。直到关闭该窗口。 该函数返回一个 DialogCode 结果。 QDialog::Accepted接受 1 QDialog::Rejected拒绝 0 1、如果对话框是应用程序模式,则用户在关闭对话框之前不能与同一应用程序中的任何其他窗口进行交互。 2、如果对话框是窗口模式,则在对话框打开时仅阻止与父窗口的交互。 3、默认情况下,对话框是应用程序模式。 显示的只能是 模态窗口,且只要去关闭窗口,操作权会一直在该窗口,开启事件循环,直到关闭该窗口。 5. showEvent() 显示事件 此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件显示事件。 非自发的显示事件在显示之前立即发送到小部件。 窗口的自发展示事件随后交付。 注意:当窗口系统更改其映射状态时,小部件会收到自发的显示和隐藏事件,例如 用户最小化窗口时的自发隐藏事件,以及再次恢复窗口时的自发显示事件。 在收到一个自发的隐藏事件后,在 isVisible() 的意义上,一个小部件仍然被认为是可见的。 |
关闭窗口常用函数有:
1、accept() void QDialog::accept() 该函数只隐藏窗口,并不删除窗口,并设置返回值为 Accepted接受。 2、reject() void QDialog::reject() 该函数同样隐藏窗口,并返回值 Rejected拒绝。 3、done(int r) void QDialog::done(int r) 关闭对话框并将其结果代码设置为 r。 如果此对话框与 exec() 一起显示,则 done() 会导致本地事件循环完成,并且 exec() 返回 r。 与 QWidget::close() 一样,如果设置了 Qt::WA_DeleteOnClose 标志,则 done() 会删除对话框。 如果对话框是应用程序的主要小部件,则应用程序终止。 如果对话框是最后一个关闭的窗口,则发出 QApplication::lastWindowClosed() 信号。 该函数 close 窗口,窗口会隐藏,是否删除取决于是否设置 Qt::WA_DeleteOnClose 。且该函数可以自己设置返回值。 这样可以利用返回值做出相应判断,如显示一个需要根据用户选择而决定下一步操作的对话框,如有三个选项:A, B, C,可以根据不同选择用 done() 函数设置不同返回值,从而进行不同处理。 4、setResult(int i) void QDialog::setResult(int i) 将模态对话框的结果代码设置为 i。 5. showEvent() [virtual protected] void QWidget::showEvent(QShowEvent *event) 此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件显示事件。 非自发的显示事件在显示之前立即发送到小部件。 窗口的自发展示事件随后交付。 注意:当窗口系统更改其映射状态时,小部件会收到自发的显示和隐藏事件,例如 用户最小化窗口时的自发隐藏事件,以及再次恢复窗口时的自发显示事件。 在收到一个自发的隐藏事件后,在 isVisible() 的意义上,一个小部件仍然被认为是可见的。 |
QColorDialog颜色对话框
QColorDialog 是 Qt 内置的颜色对话框,它允许用户选择一个颜色,并通过接口获取颜色的值,进行进一步设置。
获取QColorDialog颜色
QColorDialog 可以使用堆创建,挂载对象树的方式。但它更适合使用它的静态函数 QColorDialog::getColor() 创建匿名对象获取颜色:
getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions()) |
initial 为对话框的初始默认选择颜色。
parent 挂载到 this 或其他父窗口。
title 为对话框的标题文本。
获取到用户选择的颜色后,就可以结合 styleSheet 属性进行进一步设置:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QColorDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { QColor color=QColorDialog::getColor(QColor(255,0,0),this,"请选择颜色"); char style[512]={0}; sprintf(style,"background-color:rgb(%d,%d,%d);",color.red(),color.green(),color.blue()); this->setStyleSheet(style); } |
颜色对话框使用:
//构造颜色对话框对象 并指定父窗口 QColorDialog dlg(this); //设置颜色对话框的相关属性 dlg.setWindowTitle("Color Editor"); //设置标题 dlg.setCurrenColor(Qt :: red); // 初始颜色 //以模态方式打开颜色对话框 if(dlg.exec() == QColorDialog :: Accepted) { qDebug() << dlg.selectedColor(); } |
Qt 中的QColor类用来在程序中表示颜色的概念:
QColor类同时支持多种颜色表示方式 RGB:以 红绿蓝为基准的三色模型 HSV:以 色调 饱和度 明度 为基准的 六角锥模型 CMYK:以天蓝 品红 黄色 黑 为基准的全彩印刷色彩模型 |
输入对话框
输入对话框的使用:
//构造输入对话框 并指定父组件 QInputDialog dlg(this); //设置输入对话框的相关属性 dlg.setWindowTitle("Input..."); //窗口标题 dlg.setLabelText("Please enter a integer:");//提示用户信息 //设置当前输入对话框 输入内容类型 : /*** 输入对话框的输入模式: QInputDialog :: TextInput 输入文本字符串 QInputDialog :: IntInput 输入整形数 QInputDialog :: DoubleInput 输入浮点数 **************************************************/ dlg.setInputMode(QInputDialog ::IntInput); //以模态形式使用输入对话框 if(dlg.exec() == QInputDialog::Accepted) { qDebug() << dlg.intValue(); } |