如果你想在MainWindo界面中得到Dialog中按下确定键时的一些业务,例如,在Mainwindow界面新建项目,弹出新建项目的dialog,然后将新建项目界面获得的信息显示到MainWindow界面中,此时,你就需要在Dialog中发送一个信号,即
//Dialog.h//省略其他代码//...signal:emit signalOkClicked;
//Dialog.cpp //省略其他代码//...connect(btnOK, &QPushButton::clicked, this, &Dialoh::signalOkClicked);
然后,你在MainWindow中接收此信号即可,在槽函数slotDiaOkClicked中实现自己的业务
//MainWindow.cpp//...省略一些代码Dialog* dialog = new Dialog(this);connect(Dialog, &Dialog::signalOkClicked, this, &Mainwindow::slotDiaOkClicked)
这样写的话就是感觉比较繁琐,需要信号传信号,这边接收再写槽函数。
这时可以使用QDialogButtonBox类来添加按钮,而不是直接使用QPushButton类来添加按钮。
//Dialog.cpp//其他布局省略//...//添加按钮QDialogButtonBox* btnBox = new QDialogButtonBox(Qt::Horizontal, this);QPushButton* btnOk = btnBox->addButton(tr("确定"), QDialogButtonBox::AcceptRole);QPushButton* btnCancel = btnBox->addButton(tr("取消"), QDialogButtonBox::RejectRole);btnOk->setMinimumHeight(28);btnOk->setMinimumWidth(60);btnCancel->setMinimumHeight(28);btnCancel->setMinimumWidth(60);
后面加角色(QDialogButtonBox::AcceptRole)的作用就是为了在外面调用exec()来确定QDialog的返回结果
QDialogButtonBox在添加按钮时可以为按钮添加Role角色,这个非常重要,这样的话在外面调用时,直接使用if(dialog->exec()== QDialog::Accepted)
来判断dialog按下的是哪个按钮,而不用connect再传递一个信号给外面,也就不用接收确定按钮的connect函数和槽函数。
//MainWindow.cppDialog* dialog = new Dialog(this);if(dialog->exec()== QDialog::Accepted){//表示按下的是确定键//实现自己的业务//...}
注意
:如果使用这种方式,那么dialog不能设置setAttribute(Qt::WA_DeleteOnClose);
窗口销毁属性,窗口释放会导致发送不了信号。