第17课 对话框及其类型

本文详细介绍了Qt中的对话框概念及其实现方式,包括模态与非模态对话框的区别、应用场景及如何设置对话框的返回值。通过示例代码展示了不同类型的对话框如何创建和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、对话框的概念

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

                    

2、QDialog的意义

    2.1、 QDialog作为一种专用的交互窗口而存在(而QWidget可以作为子组件嵌入到QDialogzhong)
    2.2、 QDialog不能作为子部件嵌入到其它容器中
    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、 非模态对话框用于功能设置的场合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值