发布时间:2023-08-08 13:30
1、Qt中使用QDialog来实现对话框,QDialog继承自QWidget,对话框分为两种,一种是模态对话框、 另一种是非模态对话框。即阻塞和非阻塞对话框,而模态对话框又有两种:应用程序级别的和窗口级别的,分别指完成对话框之前阻塞整个应用和阻塞关联窗口。exec() 和 open() 分别为应用程序级别和窗口级别的模态对话框,show()则为非模态对话框。
1. QDialog::show(): 非模态,非阻塞的。
2. QDialog::exec(): 模态 ,阻塞,整个系统阻塞掉。
3. QDialog::open(): 窗口模态,只会阻塞一个窗口,而不是将整个系统阻塞掉。
2、如果使用exec()默认为模态的。如果用show()需要设置setModel(true)才是模态的。
3、exec() 是一个循环时间函数,阻塞有返回值。
函数 | 说明 |
---|---|
accept() | (返回QDialog::Accepted),表示确定 |
reject() | (返回QDialog::Rejected),表示取消 |
done( r) | (返回r), |
close() | (返回QDialog::Rejected), |
hide() | (返回 QDialog::Rejected), |
destory() | (返回QDialog::Rejected)。 |
4、销毁对象
1)调用close()并不会销毁对象,设置属性setAttribute(Qt::WA_DeleteOnClose)才会在close后销毁对象。如果没有设置属性,则效果跟hide()、setVisible()差不多,都只是起一个隐藏作用。
2)deleteLater 可在事件循环结束时销毁对话框(需要使用exec()开始事件循环)。
5.代码分析
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->btnOk,&QPushButton::clicked,this,&Dialog::slotOk);
connect(ui->btnCancel,&QPushButton::clicked,this,&Dialog::slotCancel);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::slotOk()
{
accept(); //隐藏对话框,并且dlg.exec()返回QDialog::Accepted
}
void Dialog::slotCancel()
{
reject(); //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
//hide(); //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
//close(); //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
}
//main.cpp
#include "dialog.h"
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dlg;
int n = dlg.exec();
if(n == QDialog::Accepted)
{
qDebug()<<"accept"; //点击确定按钮走这里
}
else if( n == QDialog::Rejected)
{
qDebug()<<"reject"; //点击取消按钮走这里
}
return a.exec();
}
自行参考大佬博客:Qt 之自定义界面(QMessageBox)