Qt QDialog简介

1.简介

Qt中使用QDialog来实现对话框,QDialog继承自QWidget,对话框分为两种,一种是模态对话框、 另一种是非模态对话框。即阻塞和非阻塞对话框,而模态对话框又有两种:应用程序级别的和窗口级别的,分别指完成对话框之前阻塞整个应用和阻塞关联窗口。exec() 和  open() 分别为应用程序级别和窗口级别的模态对话框,show()则为非模态对话框。

QDialog::show(): 非模态,非阻塞的。

QDialog::exec(): 模态 ,阻塞,整个系统阻塞掉。

QDialog::open(): 窗口模态,只会阻塞一个窗口,而不是将整个系统阻塞掉。

如果使用exec()默认为模态的。如果用show()需要设置setModel(true)才是模态的。

exec() 是一个循环时间函数,

当调用

accept()(返回QDialog::Accepted),表示确定

reject()(返回QDialog::Rejected),表示取消

done(r)(返回r),

close()(返回QDialog::Rejected),

hide()(返回 QDialog::Rejected),

destory()(返回QDialog::Rejected)。

还有就是delete 自己的时候也会返回 QDialog::Rejected(destory()就会delete自己)

2.销毁对象

1)调用close()并不会销毁对象,设置属性setAttribute(Qt::WA_DeleteOnClose)才会在close后销毁对象。如果没有设置属性,则效果跟hide()、setVisible()差不多,都只是起一个隐藏作用。

2)deleteLater 可在事件循环结束时销毁对话框(需要使用exec()开始事件循环)。

3.代码分析

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(ui->btnOk,&QPushButton::clicked,this,&Dialog::slotOk);
    connect(ui->btnCancel,&QPushButton::clicked,this,&Dialog::slotCancel);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::slotOk()
{
    accept();    //隐藏对话框,并且dlg.exec()返回QDialog::Accepted
}

void Dialog::slotCancel()
{
    reject();    //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
    //hide();    //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
    //close();   //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
}

//main.cpp

#include "dialog.h"
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog dlg;
    int n = dlg.exec();
    if(n == QDialog::Accepted)
    {
       qDebug()<<"accept";                //点击确定按钮走这里
    }
    else if( n == QDialog::Rejected)
    {
        qDebug()<<"reject";               //点击取消按钮走这里
    }


    return a.exec();
}

4.重写exec()方法,自定义返回值

//头文件内定义自定义返回值枚举
enum NewDialog
{
    NewDialog_Close = 0,
    NewDialog_Ok,
    NewDialog_Cancel,
};

//定义一个成员枚举变量,给个默认值
private:
    NewDialog m_dlgCode = NewDialog_Close;


//重写exec()
public:
    int exec();


//cpp实现exec();
int Dialog::exec()
{
    QDialog::exec();
    return m_dlgCode;
}

//cpp实现返回值
void Dialog::slotOk()
{
    accept();    //隐藏对话框,并且dlg.exec()返回QDialog::Accepted
    m_dlgCode = NewDialog_Ok;
}

void Dialog::slotCancel()
{
    reject();    //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
    //hide();    //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
    //close();   //隐藏对话框,并且dlg.exec()返回QDialog::Rejected
    m_dlgCode = NewDialog_Cancel;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬Sunnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值