qdialog 返回值_Qt对话框QDialog

QDialog是Qt中的基础对话框窗口类,可作为模态或非模态对话框使用。模态对话框通过exec()函数实现,阻塞主界面直至关闭,非模态对话框调用show()函数。QDialog的done(int r)函数用于设置返回值并关闭对话框。在实际应用中,可以根据exec()的返回值判断用户交互结果。注意,删除dialog时,若直接调用exec()会导致两次消息循环,应当返回done()的r值。
摘要由CSDN通过智能技术生成

QDialog是Qt中所有对话框窗口的基类

当QWidget无父组件的时候作为一个独立的窗口,有父组件的时候,将作为一个可见的部件嵌入到父组件里面。

QDialog不能作为子部件嵌入到其他容器中

对话框有模态、非模态两种情况。

模态对话框:

对于参数选择的对话框,一般用模态对话框;

显示后不能够和父窗口进行交互

是一种阻塞式对话框调用

模态对话框通过调用exec()函数实现,使用模态对话框时,事件就在对话框内部循环,必须将对话框关闭才能继续执行主界面的操作。

非模态:

对于显示或查看某些内容的对话框,一般用非模态对话框。

显示后独立存在可以同时与父窗口进行交互

非阻塞式对话框调用

非模态对话框调用show()函数实现

最后一个小技巧是设置该属性表示关闭对话框的同时删除对话框对象  就会将自己给释放不会导致内存泄漏

实例:创建一个面向对象的窗口,自己创建类class Dialog:public QDialog

#include #include#include#include#include"Dialog.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Dialog dlg;

dlg.show();returna.exec();

}

.h

#ifndef DIALOG_H#define DIALOG_H#include#include

class Dialog : publicQDialog

{

Q_OBJECTprotected:

QPushButton ModalBtn;

QPushButton NormalBtn;

QPushButton MixedBtn;protectedslots:voidModalBtn_Clicked();voidNormalBtn_Clicked();voidMixedBtn_Clicked();public:

Dialog(QWidget*parent = 0);~Dialog();

};#endif //DIALOG_H

cpp

#include "Dialog.h"#includeDialog::Dialog(QWidget*parent) :

QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)

{

ModalBtn.setText("Modal Dialog");

ModalBtn.move(20, 20);

ModalBtn.resize(100, 30);

NormalBtn.setText("Normal Dialog");

NormalBtn.move(20, 70);

NormalBtn.resize(100, 30);

MixedBtn.setText("Mixed Dialog");

MixedBtn.move(20, 120);

MixedBtn.resize(100, 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(140, 170);

}voidDialog::ModalBtn_Clicked()

{

qDebug()<< "ModalBtn_Clicked() Begin";

QDialog dialog(this);

dialog.exec();//done(Accepted);

qDebug() << "ModalBtn_Clicked() End";

}voidDialog::NormalBtn_Clicked()

{

qDebug()<< "NormalBtn_Clicked() Begin";

QDialog* dialog = new QDialog(this);//如定义为栈 QDialog dialog ; dialog->show();会一闪而过 也就是说对话框显示至桌面时,依然会继续往下运行,运行到函数的末尾(这个是消息映射函数)局部变量就被销毁了,所以对话框就消失了 如果是在堆上,销毁的只是指向这个堆对象的指针,堆对象不会被销毁,对话框就不糊消失了

dialog->setAttribute(Qt::WA_DeleteOnClose);//设置该属性即可在让在该窗口关闭时就可以释放堆上的内存了不会造成泄漏

dialog->show();//done(Rejected);

qDebug() << "NormalBtn_Clicked() End";

}void Dialog::MixedBtn_Clicked()//混合的对话框

{

qDebug()<< "MixedBtn_Clicked() Begin";

QDialog* dialog = new QDialog(this);//指定父组件this

dialog->setAttribute(Qt::WA_DeleteOnClose);

dialog->setModal(true);//设置非模态对话框的行为类似模态对话框 为混合对话框

dialog->show();//done(100);

qDebug() << "MixedBtn_Clicked() End";

}

Dialog::~Dialog()

{

qDebug()<< "~Dialog()";

}

对话框的返回值:

只有模态对话框才具有返回值(因为模态对话框用于选择的)

模态对话框返回值用于表示交互结果

实际应用中就是根据用户的操作exec得到不同的结果值,根据这些值判断做出相应的操作(进入不同的处理函数)

当删除一个dialog对象时,exec()返回QDialog::Rejected,因此在删除dialog时要特别小心。

#include #include#include#include#include"Dialog.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Dialog dlg;int r = dlg.exec();//将Dialog 设置为模态对话框,程序运行到这一行就会阻塞了

if( r ==QDialog::Accepted )

{

qDebug()<< "Accepted";

}else if( r ==QDialog::Rejected )

{

qDebug()<< "Rejected";

}else{

qDebug()<

}return r;//如果将一个对话框一模态对话框的模式运行返回值需要时r;;

//如果直接返回a.exec()就进入了两次消息循环,其实就是进入消息循环 当关闭窗口的时候应用程序不会结束了 所以返回值需要时r;

}

.c

#include "Dialog.h"#includeDialog::Dialog(QWidget*parent) :

QDialog(parent), ModalBtn(this), NormalBtn(this), MixedBtn(this)

{

ModalBtn.setText("Modal Dialog");

ModalBtn.move(20, 20);

ModalBtn.resize(100, 30);

NormalBtn.setText("Normal Dialog");

NormalBtn.move(20, 70);

NormalBtn.resize(100, 30);

MixedBtn.setText("Mixed Dialog");

MixedBtn.move(20, 120);

MixedBtn.resize(100, 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(140, 170);

}voidDialog::ModalBtn_Clicked()

{

qDebug()<< "ModalBtn_Clicked() Begin";

done(Accepted);

qDebug()<< "ModalBtn_Clicked() End";

}voidDialog::NormalBtn_Clicked()

{

qDebug()<< "NormalBtn_Clicked() Begin";

done(Rejected);

qDebug()<< "NormalBtn_Clicked() End";

}voidDialog::MixedBtn_Clicked()

{

qDebug()<< "MixedBtn_Clicked() Begin";

done(100);

qDebug()<< "MixedBtn_Clicked() End";

}

Dialog::~Dialog()

{

qDebug()<< "~Dialog()";

}

其中void QDialog::​done(int r)函数一直不理解 也没有找到说清楚的博客

最可靠的还是到帮助文档:

void QDialog::​done(int r)//设置返回值关闭对话框

Closes the dialog and sets its result code to r. If this dialog is shown with exec(), done() causes the local event loop to finish, and exec() to return r.

隐藏模式对话框并且设置结果代码为r

狄泰学院第17课 - 对话框及其类型笔记

http://blog.csdn.net/xgy_123/article/details/22219639

http://www.kuqin.com/qtdocument/qdialog.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值