第17课 对话框及其类型

1、对话框的概念

    1.1、 对话框是与用户进行 简短交互 顶层窗口
    1.2、 QDialog 是Qt中 所有对话框窗口的基类
    1.3、 QDialog 继承于QWidget 是一种 容器类型的组件
                        

                    

2、QDialog的意义

    2.1、 QDialog作为一种 专用的交互窗口 而存在(而QWidget可以作为子组件嵌入到QDialogzhong)
    2.2、 QDialo g不能 作为子部件 嵌入 到其它容器中
    2.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);//父类组件管理子组件的生命周期,且准备将QDialog嵌入到QWidget中
    w.show();
    d.show();
*/
    //将QWidget嵌套到QDialog中,显示一个窗口
    QDialog d;
    QWidget w(&d);//将QWidget嵌入到QDialog中,显示一个窗口,是可以的。
    d.show();
    w.show();
    
    return a.exec();
}

3、对话框的类型

    3.1、模态对话框(QDialog::exec())
        3.1.1、 显示后 无法与父窗口 进行交互
        3.1.2、 是一种 堵塞式的 对话框调用方式

    3.2、 非模态对话框(QDialog::show())
        3.2.1、 显示后 独立存在 可以 与父窗口进行交互
        3.2.2、 是一种 非堵塞式 的调用方式

    3.3、 一般情况下
        3.3.1、 模态对话框用于 必须依赖用户选择的场合 (80%): 消息提示、文本选择、打印设置等
        3.3.2、 非模态对话框用于 特殊功能设置的场合 (20%): 查找操作、属性设置等

    3.4、 小技巧( 父组件始终在布局的上方
        3.4.1、 在栈上 创建 模态对话框 是最简单常用的方式
        3.4.2、 一般情况下 非模态对话框 需要 在堆上创建
        3.4.3、 通过 QDialog::setModal 函数可以创建 混合特性 的对话框(就是具备模态的特性。类似模态对话框)
        3.4.4、 非模态对话框需要指定Qt::WA_DeleteOnClose属性(因为是在堆上创建的)////这句设置就是告诉QT关闭窗口时,自动释放内存,调用析构函数。(最好再手动将这个指针置为NULL)

QDialog.h
#ifndef _QDIALOG_H_
#define _QDIALOG_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();
    //~QDialog();
};

#endif // QDIALOG_H


QDialog.cpp
#include "QDialog.h"
#include <QDebug>

Dialog::Dialog(QWidget* parent) : QDialog(parent), ModalBtn(this), NorModalbtn(this), MixedBtn(this) //初始化列表
{
    ModalBtn.setText(QString("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()));
     
            this -> resize ( 800 , 800 );
}
//这是模态对话框
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);//这句设置就是告诉QT关闭窗口时,自动释放内存。

    normodal->show();

    qDebug()<< "NorModalBtn_clicked()  end";
}

void Dialog::MixedBtn_clicked()
{
    qDebug()<< "MixedModalBtn_clicked()  begin";

    QDialog* mixedmodal = new QDialog(this);

    mixedmodal->setAttribute(Qt::WA_DeleteOnClose);
    //(就是具备模态的特性。类似模态对话框)
    mixedmodal->setModal(true);//非0的数都是true, 设置混合模式的对话框。

    mixedmodal->show();

    qDebug()<< "MixedModalBtn_clicked()  end";
}

Dialog::~Dialog()
{
    qDebug() << "release?????";
}



main.cpp
#include <QtGui/QApplication>
#include "QDialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Dialog w;
    w.show();
    
    return a.exec();
}


4、对话框的返回值。

    4.1、 只有 模态对话框 才有返回值的概念(阻塞式的)
    4.2、 模态对话框的 返回值用来表示交互结果
    4.3、 QDialog::exec()的返回值为交互结果
        4.3.1、 void QDialog::done(int i) 关闭对话框并将 参数 作为交互结果
        4.3.2、 QDialog::Accepted 用户操作成功
        4.3.3、 QDialog::Rejected 用户操作失败


QDialog.h
#ifndef _QDIALOG_H_
#define _QDIALOG_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();
    //~QDialog();
};

#endif // QDIALOG_H


QDialog.cpp
#include "QDialog.h"
#include <QDebug>

Dialog::Dialog(QWidget* parent) : QDialog(parent), ModalBtn(this), NorModalbtn(this), MixedBtn(this) //初始化列表
{
    ModalBtn.setText(QString("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()));

    this->resize(800, 800);
}
//这是模态对话框
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()<< "MixedModalBtn_clicked()  begin";

    done(100);//返回这个值

    qDebug()<< "MixedModalBtn_clicked()  end";
}

Dialog::~Dialog()
{
    qDebug() << "release?????";
}




main.cpp
#include <QtGui/QApplication>
#include "QDialog.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;//返回用户的选择。
}


5、小结

    5.1、 对话框分为 模态对话框 非模态对话框
    5.2、 模态对话框是 堵塞式
    5.3、 模态对话框用于 依赖用户交互 结果的场合
    5.4、 非模态 对话框是 非堵塞式
    5.5、 非模态 对话框用于 功能设置 的场合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值