一.對話框的概念
對話框是與用戶進行簡短交互的頂層窗口。
QDialog是Qt中所有對話框窗口的基類。
QDialog繼承與QWidfet是一種容器類型的組件。
?QDialog的意義:
QDialog作為一種專業的交互窗口而存在。
QDialog不能作為子部部件嵌入其他容器中。
QDialog是定制了窗口式樣的特殊的QWidget。
二.對話框的類型
模態對話框(QDialog::exec())
- 顯示后無法與父窗口進行交互
- 是一種阻塞式的對話框調用方式
非模式對話框(QDialog::show)
- 顯示后獨立存在可以同時與父窗口進行交互
- 是一種非阻塞式的對話框調用方式。
三.對話框程序設計
main:
#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);Dialog dlg;int r = dlg.exec();if( r == QDialog::Accepted ){qDebug() << "Accepted";}else if( r == QDialog::Rejected ){qDebug() << "Rejected";}else{qDebug() << r;}return r;
}
Dialog.c
#include "Dialog.h"#include <QDebug>Dialog::Dialog(QWidget *parent) :QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)
{ModalBtn.setText("Modal Dialog");ModalBtn.move(20, 20);ModalBtn.resize(100, 30);NormalBtn.setText("Normal Dialog");NormalBtn.move(20, 70);NormalBtn.resize(100, 30);MixedBtn.setText("Mixed Dialog");MixedBtn.move(20, 120);MixedBtn.resize(100, 30);connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_Clicked()));connect(&NormalBtn, SIGNAL(clicked()), this, SLOT(NormalBtn_Clicked()));connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_Clicked()));resize(140, 170);
}void Dialog::ModalBtn_Clicked()
{qDebug() << "ModalBtn_Clicked() Begin";QDialog dialog(this);dialog.exec(); //阻塞式調用// done(Accepted);qDebug() << "ModalBtn_Clicked() End";
}void Dialog::NormalBtn_Clicked()
{qDebug() << "NormalBtn_Clicked() Begin";QDialog* dialog = new QDialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();// done(Rejected);qDebug() << "NormalBtn_Clicked() End";
}void Dialog::MixedBtn_Clicked()
{qDebug() << "MixedBtn_Clicked() Begin";QDialog* dialog = new QDialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->setModal(true);dialog->show();// done(100);qDebug() << "MixedBtn_Clicked() End";
}Dialog::~Dialog()
{qDebug() << "~Dialog()";
}
Dialog.h
#ifndef DIALOG_H
#define DIALOG_H#include <QtGui/QDialog>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECT
protected:QPushButton ModalBtn;QPushButton NormalBtn;QPushButton MixedBtn;
protected slots:void ModalBtn_Clicked();void NormalBtn_Clicked();void MixedBtn_Clicked();
public:Dialog(QWidget *parent = 0);~Dialog();
};#endif // DIALOG_H
Dialog::ModalBtn_Clicked()為阻塞式調用,程序會一直卡在ModalBtn_Clicked() Begin,只有將對話框關閉,程序還會繼續向下運行,ModalBtn_Clicked() End才會打印。
Dialog::NormalBtn_Clicked()為非阻塞式調用,程序會一直運行,NormalBtn_Clicked() Begin,NormalBtn_Clicked() End,會連續打印,但還是不能和其他窗口進行交互。
小結: