码迷,mamicode.com
首页 > 其他好文 > 详细

第17课 对话框及其类型

时间:2016-05-01 12:21:39      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:

1. 对话框的概念

(1)概念

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

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

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

技术分享 

(2)QDialog的意义

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

  ②QDialog不能作为子部件嵌入其它容器中

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

【编程实验】QDialog和QWidget的区别

#include <QApplication>
#include <QWidget>
#include <QDialog>

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

    //实验1:将dialog作为widget的子对象,但不能被嵌入widget
    QWidget *widget = new QWidget();
    QDialog dialog(widget); //这里虽然将widget作为dialog的父组件,但
                            //dialog并不会被嵌入widget中,

    //以下代码会显示出两个顶层窗口,而不是只有一个!
    dialog.show();
    dialog.setWindowTitle("I‘m dialog");

    widget->show();
    widget->setWindowTitle("I‘m widget");

//    //实验2:将widget作为dialog的子对象,这是合法的
//    QDialog dialog;
//    QWidget *widget = new QWidget(&dialog);

//    //以下代码会显示出两个顶层窗口,而不是只有一个!
//    dialog.show();
//    dialog.setWindowTitle("I‘m dialog");

//    widget->show();
//    widget->setWindowTitle("I‘m widget");

    return a.exec();
}

2.对话框的类型

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

  ①显示后无法与父窗口进行交互

  ②是一种阻塞式的对话框调用方式

  ③一般情况下,模态对话框用于必须依赖用户选择的场合(80%)。如消息提示、文件选择、打印设置等。

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

  ①显示后独立存在,可以同时与父窗口进行交互

  ②是一种非阻塞式的对话框调用方式

  ③用于特殊功能设置的场合(20%)。如查找操作、属性设置等。

▲小技巧

  ①在栈上创建模态对话框是最简单常用的方式

  ②一般情况下非模态对话框需要在堆上创建

  ③通过QDialog::setModal函数可以创建混合特性的对话框。

  ④非模态对话框需要指定Qt::WA_DeleteOnClose属性。即关闭时删除以避免内存泄漏。

【编程实验】不同特性的对话框

技术分享

//main.cpp

#include <QApplication>
#include "Dialog.h"

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

    Dialog dlg; //模态对话框一般在栈上创建对象,非模态在堆上

    dlg.exec();//模态显示

    return 0;
}

//Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QPushButton>

class Dialog: public QDialog
{
    Q_OBJECT
protected:
    QPushButton ModalBtn;
    QPushButton NormalBtn;
    QPushButton MixedBtn;

    QPushButton AcceptBtn;
    QPushButton RejectBtn;

protected slots:
    void ModalBtn_Clicked();
    void NormalBtn_Clicked();
    void MixedBtn_Clicked();
    void AcceptBtn_Clicked();
    void RejectBtn_Clicked();

public:
    Dialog(QWidget* parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

//Dialog.cpp

#include <QDebug>
#include "Dialog.h"


Dialog::Dialog(QWidget* parent):
           QDialog(parent),
           ModalBtn(this),NormalBtn(this),MixedBtn(this),
           AcceptBtn(this),RejectBtn(this)

{
    ModalBtn.setText("Modal Dialog");
    ModalBtn.move(20, 20);
    ModalBtn.resize(150, 30);

    NormalBtn.setText("Normal Dialog");
    NormalBtn.move(20, 70);
    NormalBtn.resize(150, 30);

    MixedBtn.setText("Mixed Dialog");
    MixedBtn.move(20, 120);
    MixedBtn.resize(150, 30);

    AcceptBtn.setText("Accept");
    AcceptBtn.move(20,170);
    AcceptBtn.resize(70,30);

    RejectBtn.setText("Reject");
    RejectBtn.move(100,170);
    RejectBtn.resize(70,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()));
    connect(&AcceptBtn,  SIGNAL(clicked()),   this, SLOT(AcceptBtn_Clicked()));
    connect(&RejectBtn,  SIGNAL(clicked()),   this, SLOT(RejectBtn_Clicked()));

    resize(190, 220);
}

void Dialog::ModalBtn_Clicked()
{
    qDebug() << "ModalBtn_Clicked()...Begin";

    QDialog dlg(this);

    dlg.setWindowTitle("I‘m a Modal Dialog");
    dlg.exec(); //模态

    qDebug() << "ModalBtn_Clicked()...End";
}

void Dialog::NormalBtn_Clicked()
{
    qDebug() << "NormalBtn_Clicked()...Begin";

    QDialog* dlg = new QDialog(this);//非模态,在堆上创建

    dlg->setWindowTitle("I‘m a Normal Dialog");
    dlg->setAttribute(Qt::WA_DeleteOnClose); //当窗体关闭时被删除,同时将自己从
                                             //父对象链表中移除,所以dlg不会被
                                             //析构两次!

    dlg->show(); //非模态

    qDebug() << "NormalBtn_Clicked()...End";
}

void Dialog::MixedBtn_Clicked()
{
    qDebug() << "MixedBtn_Clicked()...Begin";

    //混合特性的对话框,要在堆上创建对象
    QDialog* dlg = new QDialog(this);

    dlg->setWindowTitle("I‘m a Mixed Dialog");
    dlg->setAttribute(Qt::WA_DeleteOnClose); //当窗体关闭时被删除,同时将自己从
                                             //父对象链表中移除,所以dlg不会被
                                             //析构两次!
    dlg->setModal(true);//设置为模态的
    dlg->show(); //虽然此处调用的是show,但仍以模态方式显示

    qDebug() << "MixedBtn_Clicked()...End";
}

void Dialog::AcceptBtn_Clicked()
{
    done(Accepted);//结束对话框,并返回Accepted
}

void Dialog::RejectBtn_Clicked()
{
    done(Rejected);//结束对话框,并返回Rejected
}

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

3. 对话框的返回值

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

(2)模态对话框的返回值用于表示交互结果

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

  ①void QDialog::done(int):调用该函数,用来关闭对话框,并将参数作为交互结果。

  ②QDialog::Accepted:用户操作成功

  ③QDialog::Rejected:用户操作失败

【编程实验】对话框的返回值

//main.cpp

#include <QApplication>
#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.h和Dialog.cpp文件与前一个例子相同

4. 小结

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

(2)模态对话框是阻塞式的

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

(4)非模态对话框是非阻塞式的

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

第17课 对话框及其类型

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5450182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!