QT17 - 对话框及其类型 QDialog

本文学习自 狄泰软件 唐佐林老师的 QT课程。


QDialog是QT中所有对话框的基类,QDialog继承于QWidget 是一种容器类型的组件,QDialog 对象 只能 必须 作为顶层的窗口而存在,不能作为子部件嵌入其他容器中,QDialog是定制了窗口样式的特殊的 QWidget。而QDialog 与 QWidget的区别也就是, QDialog 只能 作为顶层的窗口,而QWidget不是。

QDialog可以创建:

1 模态对话框: 阻塞式对话框,在栈上创建,显示后 无法与父窗口交互,一直位于顶层

QDialog::exec() ,创建模态对话框,注意在栈上创建 QDialog对象
只有模态对话框 有返回值概念,表示交互结果
QDialog::done(int i) :关闭对话框,并将参数作为交换结果
参数为:Accepted :用户操作成功
参数为:Rejected  :用户操作失败
具体值:其他

2 非模态对话框:非阻塞式对话框,在堆上创建,显示后,可以与父窗口交互

QDialog* dialog = new QDialog(this); 注意在堆上创建 QDialog对象,并指定父子关系,指定父组件,这样组件会一直在父组件上
Qt::WA_DeleteOnClose :需要设置 属性 释放资
QDialog::show() 
可以与父组件交互,需要设置父组件this,才会一直位于父组件上面

3 混合态对话框 : 程序不阻塞,但是对话框阻塞,显示后无法与父窗口进行交互

Qt::WA_DeleteOnClose :需要设置 属性 释放资
       QDialog::setModal(true);//设置混合特性对话框属性,创建 混合态对话框。
       QDialog::show();

实验 :QDialog 模态,非模态,混合态 对话框 使用

头文件:

#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.cpp
#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); 一般都是这样写,设定其父组件是主窗口,这样该组件就可以一直显示在其父组件上面。
       QDialog dialog;这样写也可以,因为此处将要创建的对话框dialog是 模态对话框,是阻塞式对话框,不论指不指定其父组件,效果都是模态对话框在顶层。
    */
    QDialog dialog(this);
    dialog.exec(); //创建模态对话框
    // done(Accepted);
    qDebug() << "ModalBtn_Clicked() End";
}
void Dialog::NormalBtn_Clicked()
{
    qDebug() << "NormalBtn_Clicked() Begin";
    /*
       非模态对话框 是非阻塞式对话框,如果在栈上创建,那么在对话框 dialog.show() 显示之后,不会阻塞停留,依旧会向下运行,程序运行结束,
       局部变量被释放,dialog被销毁,对话框一闪而逝。
    QDialog dialog;
    dialog.show();
     */
    /*
       非模态对话框 在堆上创建,避免一闪而过。
       dialog->setAttribute(Qt::WA_DeleteOnClose);设置对话框关闭释放资源属性,如果不设置该属性,则dialog指针会在程序结束后释放,而指向的空间被泄露。
        为非模态对话框设置 Qt::WA_DeleteOnClose 属性,会在对话框关闭时候 自己释放所占用的内存空间,避免内存泄漏
       new QDialog(this); 指定其父组件,使该对话框一直位于其父组件之上。这里不是阻塞式对话框,需要强制指定,否则父组件被点击时,会在该组件之上。
    */
    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);//非阻塞是对话框都需要设置 WA_DeleteOnClose属性
    //混合特性对话框特点:程序不阻塞,但是对话框阻塞,显示后无法与父窗口进行交互
    dialog->setModal(true);//设置混合特性对话框属性,创建 混合态对话框。
    dialog->show();
    // done(100);
    qDebug() << "MixedBtn_Clicked() End";
}
Dialog::~Dialog()
{
    qDebug() << "~Dialog()";
}

main.cpp

#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dlg;

    dlg.show();//显示对话框

    return a.exec();
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/114906464