Qt QDialog详解、自定义QMessageBox

一、简介

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

1. QDialog::show(): 非模态,非阻塞的。
2. QDialog::exec(): 模态 ,阻塞,整个系统阻塞掉。
3. QDialog::open(): 窗口模态,只会阻塞一个窗口,而不是将整个系统阻塞掉。

2、如果使用exec()默认为模态的。如果用show()需要设置setModel(true)才是模态的。
3、exec() 是一个循环时间函数,阻塞有返回值。

函数 说明
accept() (返回QDialog::Accepted),表示确定
reject() (返回QDialog::Rejected),表示取消
done( r) (返回r),
close() (返回QDialog::Rejected),
hide() (返回 QDialog::Rejected),
destory() (返回QDialog::Rejected)。

4、销毁对象

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

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

5.代码分析

#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 
#include 
 
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();
}

二、自定义QMessageBox

自行参考大佬博客:Qt 之自定义界面(QMessageBox)

你可能感兴趣的:(Qt基础/高级,qt,qt5)