QDialog
继承自QWitget
,自然从基类继承了显示函数show
。然而QDialog
还有一个特殊的显示函数exec
,二者的区别如下:
show
:显示一个非modal
的对话框,控制权立刻返回给调用函数,弹出窗口是否为model
对话框,可由modal
值决定。exec
:显示一个modal
的对话框,并且锁住程序,直到用户关闭对话框为止,函数返回一个DialogCode
结果。在对话框弹出期间,用户不可切换至其他窗口。
mydialog.h
如下:
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
namespace Ui {
class MyDialog;
}
class MyDialog : public QDialog {
Q_OBJECT
public:
explicit MyDialog ( QWidget *parent = 0 );
~MyDialog();
private slots:
void on_pushButton_clicked();
private:
Ui::MyDialog *ui;
};
#endif // MYDIALOG_H
mywidget.h
如下:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget ( QWidget *parent = 0 );
~MyWidget();
private:
Ui::MyWidget *ui;
public slots:
void on_showChildButton_clicked();
private slots:
void on_pushButton_clicked();
};
#endif // MYWIDGET_H
mydialog.cpp
如下:
#include "mydialog.h"
#include "ui_mydialog.h"
MyDialog::MyDialog ( QWidget *parent ) : QDialog ( parent ), ui ( new Ui::MyDialog ) {
ui->setupUi ( this );
}
MyDialog::~MyDialog() {
delete ui;
}
void MyDialog::on_pushButton_clicked() {
accept();
}
mywidget.cpp
如下:
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDialog>
#include "mydialog.h"
#include <QDebug>
MyWidget::MyWidget ( QWidget *parent ) : QWidget ( parent ), ui ( new Ui::MyWidget ) {
ui->setupUi ( this );
}
MyWidget::~MyWidget() {
delete ui;
}
void MyWidget::on_showChildButton_clicked() { /* 显示子窗口按钮 */
QDialog *dialog = new QDialog ( this );
dialog->show();
}
void MyWidget::on_pushButton_clicked() { /* 重新登录按钮 */
close(); /* 先关闭主界面,其实是隐藏起来了,并没有真正退出 */
MyDialog dlg; /* 新建MyDialog对象 */
/* 如果按下了“进入主窗口”按钮,则再次显示主界面。
否则,因为现在已经没有显示的界面了,所以程序将退出 */
if ( dlg.exec() == QDialog::Accepted ) {
show();
}
}
main.cpp
如下:
#include <QtGui/QApplication>
#include "mywidget.h"
#include "mydialog.h"
int main ( int argc, char *argv[] ) {
QApplication a ( argc, argv );
MyWidget w;
MyDialog dialog; /* 新建MyDialog类对象 */
if ( dialog.exec() == QDialog::Accepted ) { /* 判断dialog执行结果 */
w.show(); /* 如果是按下了“进入主界面”按钮,则显示主界面 */
return a.exec(); /* 程序正常运行 */
} else {
return 0; /* 否则,退出程序 */
}
}
对于QDialog
的accept
函数和reject
函数,这两个函数都能够隐藏QDialog
。但是返回的值不同,一个是Accepted
,一个是Rejected
。通过返回值可以区分用户按下的是OK
按钮,还是Cancel
按钮。