第十七课、对话框及其类型------------------狄泰软件学院

一、对话框的概念

1、对话框是与用户进行简短交互顶层窗口

2、QDialog是Qt中所有对话框窗口的基类

3、QDialog继承于QWidget是一种容器类型的组件

二、QDialog的意义

1、QDialog作为一种专用的交互窗口而存在

2、QDialog不能作为子部件嵌入到其它容器中

3、QDialog是定制了窗口式样的特殊QWidget

#include <QtGui/QApplication>
#include <QWidget>
#include <QDialog>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
  /*显示两个窗口,QDialog不会嵌套到QWidget中,且QDialog在顶层
    QWidget w;
    QDialog d(&w);
    w.show();
    d.show();
  */

    
    //QWidget嵌套到QDialog中,显示一个窗口
    QDialog d;
    QWidget w(&d);

    d.show();
    w.show();

    return a.exec();
}
View Code

三、对话框的类型

1、模态对话框(QDialog::exec())

(1)、显示后无法与父窗口进行交互

(2)、是一种堵塞式的对话框调用方式

2、非模态对话框(QDialog::show())

(1)、显示后独立存在可以与父窗口进行j交互

(2)、是一种非堵塞式的调用方式

3、一般情况下

(1)、模态对话框用于必须依赖用户选择的场合(80%):消息提示、文本选择、打印设置等

(2)、非模态对话框用于特殊功能设置的场合(20%):查找操作、属性设置等

4、小技巧

(1)、在栈上创建模态对话框是最简单常用的方式

(2)、一般情况下非模态对话框需要在堆上创建

(3)、通过QDialog::setModal函数可以创建混合特性的对话框

(4)、非模态对话框需要指定Qt::WA_DeleteOnClose属性

#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT
protected:
    QPushButton ModalBtn;
    QPushButton NorModalBtn;
    QPushButton MixedBtn;
protected slots:
    void ModalBtn_clicked();
    void NorModalBtn_clicked();
    void MixedBtn_clicked();
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H
Dialog.h
#include "Dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ModalBtn(this), NorModalBtn(this), MixedBtn(this)
{
    ModalBtn.setText("ModalBtn");
    ModalBtn.move(35, 20);
    ModalBtn.resize(100,30);


    NorModalBtn.setText("NorModalBtn");
    NorModalBtn.move(35, 60);
    NorModalBtn.resize(100,30);

    MixedBtn.setText("MixedBtn");
    MixedBtn.move(35, 100);
    MixedBtn.resize(100,30);

    connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_clicked()));//关联信号与槽
    connect(&NorModalBtn, SIGNAL(clicked()), this, SLOT(NorModalBtn_clicked()));
    connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_clicked()));

    resize(170,170);
}

void Dialog::ModalBtn_clicked()
{
    qDebug() << "ModalBtn_clicked begin";

    QDialog modal(this);//在栈中生成
    modal.exec();//调用exec()函数成为模态对话框,堵塞式

    qDebug() << "ModalBtn_clicked end";
}
void Dialog::NorModalBtn_clicked()
{
    qDebug() << "NorModalBtn_clicked begin";

    QDialog* normodal =  new QDialog(this);//在堆中分配,指定父窗口后就会始终在父窗口顶层

    normodal->setAttribute(Qt::WA_DeleteOnClose);

    normodal->show();//非模态对话框是非堵塞式,成为非模态对话框后立即向下执行,所以要在堆中生成

    qDebug() << "NorModalBtn_clicked end";
}
void Dialog::MixedBtn_clicked()
{
    qDebug() << "MixedBtn_clicked begin";

    QDialog* mixedbtn = new QDialog(this);
    mixedbtn->setAttribute(Qt::WA_DeleteOnClose);
    mixedbtn->setModal(true);//设置混合对话框,注意参数是bool类型
    mixedbtn->show();

    qDebug() << "MixedBtn_clicked end";
}

Dialog::~Dialog()
{
    
}
QDialog.cpp
#include <QtGui/QApplication>
#include "Dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    
    return a.exec();
}
main.cpp

三、对话框的返回值

1、只有模态对话框才有返回值的概念

2、模态对话框的返回值用来表示交互结果

3、QDialog::exec()的返回值为交互结果

(1)、void QDialog::done(int i) 关闭对话框并将参数作为交互结果

(2)、QDialog::Accepted 用户操作成功

(3)、QDialog::Rejected 用户操作失败

#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT
protected:
    QPushButton ModalBtn;
    QPushButton NorModalBtn;
    QPushButton MixedBtn;
protected slots:
    void ModalBtn_clicked();
    void NorModalBtn_clicked();
    void MixedBtn_clicked();
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H
Dialog.h
#include "Dialog.h"
#include <QDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent), ModalBtn(this), NorModalBtn(this), MixedBtn(this)
{
    ModalBtn.setText("ModalBtn");
    ModalBtn.move(35, 20);
    ModalBtn.resize(100,30);


    NorModalBtn.setText("NorModalBtn");
    NorModalBtn.move(35, 60);
    NorModalBtn.resize(100,30);

    MixedBtn.setText("MixedBtn");
    MixedBtn.move(35, 100);
    MixedBtn.resize(100,30);

    connect(&ModalBtn, SIGNAL(clicked()), this, SLOT(ModalBtn_clicked()));//关联信号与槽
    connect(&NorModalBtn, SIGNAL(clicked()), this, SLOT(NorModalBtn_clicked()));
    connect(&MixedBtn, SIGNAL(clicked()), this, SLOT(MixedBtn_clicked()));

    resize(170,170);
}

void Dialog::ModalBtn_clicked()
{
    qDebug() << "ModalBtn_clicked begin";

    done(Accepted);

    qDebug() << "ModalBtn_clicked end";
}
void Dialog::NorModalBtn_clicked()
{
    qDebug() << "NorModalBtn_clicked begin";

    done(Rejected);

    qDebug() << "NorModalBtn_clicked end";
}
void Dialog::MixedBtn_clicked()
{
    qDebug() << "MixedBtn_clicked begin";

    done(100);

    qDebug() << "MixedBtn_clicked end";
}

Dialog::~Dialog()
{
    
}
Dialog.cpp
#include <QtGui/QApplication>
#include "Dialog.h"
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    int r = w.exec();//这里已经是进入消息循环,所以返回值那里不再用a.exec()

    if(r==QDialog::Accepted)
    {
        qDebug() << "Accepted";
    }
    else if(r == QDialog::Rejected)
    {
        qDebug() << "Rejected";
    }
    else
    {
        qDebug() << r;
    }
    return r;
}
main.cpp

四、小结

(1)、对话框分为模态对话框非模态对话框

(2)、模态对话框是堵塞式

(3)、模态对话框用于依赖用户交互结果的场合

(4)、非模态对话框是非堵塞式

(5)、非模态对话框用于功能设置的场合

原文地址:https://www.cnblogs.com/gui-lin/p/6400056.html