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


    一、对话框的概念

    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)、非模态对话框用于功能设置的场合

  • 相关阅读:
    appfabric cache配置,实验记录
    appfabric cache存储ef 查询结果的bug
    CruiseControl.NET svn获取 自动编译 ftp上传
    @Ajax.RenderAction 把局部页改为ajax加载
    分布式架构下的mvc 异步controller ajax comet 长连接
    win7重装iis,搞死
    验证码识别的基本思路及方法
    C# 获取程序当前文件夹
    在c#中 限制文本框只能输入数字
    string字符串 获取指定位置范围的子字符串
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6400056.html
Copyright © 2020-2023  润新知