学习目的:
Qt 对话框QDialog 学习。
对话框是与用户进行简短交互的顶层窗口
QDailog是Qt中所有对话框的基类
QDailog继承于QWidget是一种容器类型的组件
—— QDialog作为专用的交互窗口而存在
——QDialog不能作为子部件嵌入其它容器中
——QDialog其实就是定制了窗口样式的特殊QWidget
实验:QDialog与QWidget的区别
测试代码:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QDialog* dai = new QDialog(&w);//将QDialog 组件嵌入QWidget 中 dai->setWindowTitle("this is Dialog"); dai->show(); w.setWindowTitle("this is Widget "); w.show(); w.resize(100,120); dai->resize(100,120); return a.exec(); }
运行结果:
运行上面代码 将出现两个对话框,也就证明了 QDialog不能作为子部件嵌入其它容器中。
对话框的类型:
模态对话框(QDialog::exec()) 用在必须依赖用户选择的场合,在栈上建立即可
——显示后无法与父窗体进行交互
——是一种阻塞式的对话框嗲用方式
非模态对话框(Dialog->show()) 用在特殊功能设置的场合,需要在堆上创建,在栈上创建的不能一直显示出来(需要指定Qt::WA_DeletteOnClose属性,在结束对话框后删除掉此对话框所使用的资源)
——显示后独立存在可以同时与父窗体进行交互
——是一种非阻塞式的对话框调用方式
注: 可以通过QDialog::setModal函数可以创建混合特性的对话框。以非阻塞方式调用,但是是不可以操作父窗体的。
模态对话框实验:
1、建立一个Qdialog对象
2、调用对象的exec();进入消息循环
代码:
void Dialog::ModalBtn_Clicked()
{
qDebug()<<"ModalBtn_Clicked() Begin";
// QDialog* dialog = new QDialog(this);
// dialog->exec();
QDialog Dialog(this);
Dialog.setWindowTitle("Modal Dialog");
Dialog.exec();
qDebug()<<"ModalBtn_Clicked() End";
}
运行结果:
不能继续操作父窗体。
非模态对话框实验:
void Dialog::NoremalBtn_Clicked() { qDebug()<<"NoremalBtn_Clicked() Begin"; QDialog* dialog = new QDialog(this); //Dialog dialog = new Dialog(this); dialog->setWindowTitle("Normoal Dialog"); dialog->show(); dialog->setAttribute(Qt::WA_DeleteOnClose);//关闭对话框自动删除 dialog 对象 qDebug()<<"NoremalBtn_Clicked() End"; }
运行结果:
显示后独立存在可以同时与父窗体进行交互,是一种非阻塞式的对话框调用方式。
混合特性的对话框:
void Dialog::MixedBtn_Clicked() { qDebug()<<"MixedBtn_Clicked() Begin"; QDialog* dialog = new QDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose);//关闭对话框自动删除 dialog 对象 dialog->setModal(true); dialog->show(); qDebug()<<"MixedBtn_Clicked() End"; }
对话框返回值:
——只有模态对话框才有返回值的概念,由于模态对话框是阻塞的。
——模态对话框的返回值用户表示交互结果
QDialog::exec()的返回值为交互结果
——void Qdialog::done(int i) 关闭对话框将参数作为交互结果
——QDialog::Accepted 用户操作成功
——Qdialog::Rejected 用户操作失败