QDialog - 对话框

QDialog - 对话框

一. 对话框

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

  2. QDialog是Qt中所有对话框

  3. QDialog继承于QWidget是一种容器类组件

QObject QWidget QPaintDevice QDialog
  1. QDialog作为一种专用的交互窗口而存在

  2. 不能作为子部件嵌入其它容器中

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

二. 对话框的特点

  1. 代码 - Widget作为Dialog的父组件时

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QWidget w;
        QDialog dl(&w);
    
        dl.setWindowTitle("Dialog");
        dl.show();
    
        w.setWindowTitle("Widget");
        w.show();
    
        return a.exec();
    }
    
    
    

    请添加图片描述

  2. 代码 - Dialog作为Widget的父组件时

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
    
        QDialog dl;
        QWidget w(&dl);
    
        dl.setWindowTitle("Dialog");
        dl.show();
    
        w.setWindowTitle("Widget");
        w.show();
    
        return a.exec();
    }
    
    

    请添加图片描述

三. 对话框的类型

  1. 模态对话框

    //显示后无法与父窗口进行交互
    //是一种阻塞式的对话框调用方式
    QDialog::exec();
    

    如下图所示,Qt中的【选项】弹出的对话框就是一种模态对话框,这个对话框弹出来后,点击Qt的主窗口是无法点击的,只能关掉【选项】这个对话框才可以

    请添加图片描述

  2. 非模态对话框

    //显示后独立存在可以同时与父窗口进行交互
    //是一种非阻塞式的对话框调用方式
    QDialog::show();
    

    非模态对话框我们看一下typora【更新】弹出来的这个对话框,弹出后,点击typora主页面不影响和主页面的交互,是一种非模态对话框

    请添加图片描述

四. 实验

  1. 类的声明

    #ifndef DIALOG_H
    #define DIALOG_H
    
    #include <QDialog>
    
    #include <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
    
    
  2. 类的构造

    #include "Dialog.h"
    #include "ui_Dialog.h"
    
    #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(200, 30);
    
        NormalBtn.setText("Normal Dialog");
        NormalBtn.move(20, 70);
        NormalBtn.resize(200, 30);
    
        MixedBtn.setText("Mixed Dialog");
        MixedBtn.move(20, 120);
        MixedBtn.resize(200, 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(240, 170);
        setFixedSize(width(), height());
    }
    
    Dialog::~Dialog()
    {
        qDebug() << "~Dialog()";
    }
    
  3. 模态对话框 - 在槽函数中实现

    void Dialog::ModalBtn_Clicked()
    {
        qDebug() << "ModalBtn_Clicked() Begin";
    
        QDialog dialog(this);   //模态对话框
        dialog.resize(300, 100);
        dialog.setWindowTitle("Modal Dialog");
    
        dialog.exec();  //显示一个模态对话框,只有模态对话框才有返回值的概念,模态对话框的返回值用于表示交互结果
        dialog.setFixedSize(width(), height());
        // done(Accepted);
    
        qDebug() << "ModalBtn_Clicked() End";
    }
    
    
    

    请添加图片描述

  4. 非模态对话框

    void Dialog::NormalBtn_Clicked()
    {
        qDebug() << "NormalBtn_Clicked() Begin";
    
    #if 0
        QDialog dialog(this);   //非模态对话框在栈区开辟内存空间
        dialog.resize(300, 100);
        dialog.setWindowTitle("Normal Dialog");
        dialog.show();         //因为其没有阻塞的概念,会立即返回
    
    #else
        QDialog* dialog = new QDialog(this);   //非模态对话框没有阻塞的概念,要在堆区开辟内存空间
    //    QDialog* dialog = new Dialog(this);
        dialog->setWindowTitle("Normal Dialog");
        dialog->resize(300, 100);
    
        dialog->setAttribute(Qt::WA_DeleteOnClose); //设置属性,防止内存泄漏
        dialog->show();
    
        // done(Rejected);
    #endif
    
        qDebug() << "NormalBtn_Clicked() End";
    
    }
    
    

    因为非模态对话框没有阻塞的概念,如果在栈区开辟内存空间,根据程序的运行会直接释放掉对话框,对话框只会显示一瞬

    请添加图片描述

    解决方法是,在堆区为非模态对话框申请空间,可以看到非模态对话框可以正常显示,并且没有阻塞其它窗口

    请添加图片描述

  5. 混合类型的对话框 - 使用show()方法即非模态对话框,但是显示出来的属性特点是模态对话框

    void Dialog::MixedBtn_Clicked()
    {
        qDebug() << "MixedBtn_Clicked() Begin";
    
        QDialog* dialog = new QDialog(this);
    
        dialog->setWindowTitle("Mixed Dialog");
        dialog->resize(300, 100);
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->setModal(true);    //设置非模态对话框,表现为模态对话框
        dialog->show();
    
        // done(100);
    
        qDebug() << "MixedBtn_Clicked() End";
    }
    
    

    请添加图片描述

  6. main函数的内容

    #include "Dialog.h"
    
    #include <QApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        Dialog dl;
        dl.show();
    
        return a.exec();
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值