Qt(模态对话框的切换)
目录
模态对话框:
信号和槽函数:
示例:
子界面:
主界面:
主函数:
exec():
hide()和close():
accept()和reject():
模态对话框:
https://blog.csdn.net/HMBBLOVEPDX/article/details/151903050?spm=1001.2014.3001.5501
信号和槽函数:
https://blog.csdn.net/HMBBLOVEPDX/article/details/151928089?spm=1001.2014.3001.5501
示例:
子界面:
#ifndef CHILDDIALOG_H
#define CHILDDIALOG_H#include <QDialog>namespace Ui {
class ChildDialog;
}class ChildDialog : public QDialog
{Q_OBJECTpublic:explicit ChildDialog(QWidget *parent = nullptr);~ChildDialog();private slots:void on_pushButton_clicked();private:Ui::ChildDialog *ui;
};#endif // CHILDDIALOG_H
#include "childdialog.h"
#include "ui_childdialog.h"ChildDialog::ChildDialog(QWidget *parent): QDialog(parent), ui(new Ui::ChildDialog)
{ui->setupUi(this);
}ChildDialog::~ChildDialog()
{delete ui;
}void ChildDialog::on_pushButton_clicked()
{accept();
}
主界面:
#ifndef MAINDIALOG_H
#define MAINDIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui {
class MainDialog;
}
QT_END_NAMESPACEclass MainDialog : public QDialog
{Q_OBJECTpublic:MainDialog(QWidget *parent = nullptr);~MainDialog();private slots:void on_pushButton_clicked();private:Ui::MainDialog *ui;
};
#endif // MAINDIALOG_H
#include "maindialog.h"
#include "ui_maindialog.h"
#include <QDebug>
#include "ChildDialog.h"MainDialog::MainDialog(QWidget *parent): QDialog(parent), ui(new Ui::MainDialog)
{ui->setupUi(this);
}MainDialog::~MainDialog()
{delete ui;
}void MainDialog::on_pushButton_clicked()
{close();ChildDialog childDialog;if(childDialog.exec()==QDialog::Accepted){qDebug()<<"点击了切换到主界面";this->show();}else{qDebug()<<"退出";return;}
}
主函数:
#include "maindialog.h"#include <QApplication>
#include "ChildDialog.h"
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainDialog w;ChildDialog childDialog;if(childDialog.exec()==QDialog::Accepted){qDebug()<<"点击了切换到主界面";childDialog.hide();w.show();}else{qDebug()<<"退出";return 0;}return a.exec();
}
exec():
exec()函数是QDialog类及其子类的核心成员函数,用于以模态方式显示对话框。调用exec()时,会启动一个局部事件循环,阻塞对话框之外的其他窗口的访问,直到对话框被关闭。该函数返回值为QDialog::DialogCode
枚举值,enum DialogCode { Rejected, Accepted };Rejected值为0,Accepted值为1。仅当对话框以模态方式(exec()
)显示时,reject()
才会通过返回值(QDialog::Rejected
)影响上层逻辑;若使用show()
,reject()
仅关闭窗口,不传递返回值。
exec()
函数内部实现包含以下关键步骤:
自动显示对话框:exec()
内部首先调用show()
方法显示对话框,无需开发者显式调用。
启动事件循环:创建一个局部QEventLoop
对象来阻塞当前线程。
处理事件队列:循环执行已排队任务,类似于while(1)
嵌套结构,但不会导致界面卡死。
返回关闭状态:对话框关闭后返回结果值,事件循环终止。
hide()和close():
hide()
:仅隐藏窗口(setVisible(false)
),不触发关闭事件,窗口对象仍驻留内存且保留所有状态。
close()
:关闭窗口并释放资源(若设置Qt::WA_DeleteOnClose
则销毁对象),默认行为等同于hide()
,但可通过重写closeEvent()
拦截。
hide()
:窗口可随时通过show()
重新显示,适用于需频繁切换可见性的场景(如后台悬浮窗)。
close()
:若未设置自动销毁属性,窗口资源可能泄漏;若设置,则对象不可复用。
hide()
:仅触发hideEvent()
,不涉及关闭逻辑。
close()
:触发closeEvent()
,可被重写以实现保存数据等操作。
保留状态:需临时隐藏窗口(如设置面板)时用hide()
。
彻底释放:需销毁窗口(如退出对话框)时用close()
,并配合Qt::WA_DeleteOnClose
属性。
accept()和reject():
accept()
表示用户确认操作(如点击“确定”按钮),隐藏对话框并返回QDialog::Accepted
状态码(值为1)。
reject()
表示用户取消操作(如点击“取消”按钮),隐藏对话框并返回QDialog::Rejected
状态码(值为0)。
函数 | 行为 | 适用场景 |
---|---|---|
accept() | 隐藏对话框,返回Accepted ,触发accepted() 信号 | 用户明确确认操作(如保存设置) |
reject() | 隐藏对话框,返回Rejected ,触发rejected() 信号 | 用户取消操作(如放弃编辑) |
close() | 发送QCloseEvent ,默认调用hide() ,可拦截事件 | 需自定义关闭逻辑(如提示保存) |
hide() | 仅隐藏窗口,不改变状态码 | 临时隐藏窗口(如最小化) |