QT
模态对话框消息传递通过 ui
文件,不用 connect
来连接的方式看着实现很便捷,但是文件多了的时候就很乱,不知道谁连接的谁......
用 connect
的方式看起来有理有据,条理清晰,文件多的时候,也是不知道在什么文件里用了的......
我们创建一个模态对话框,调用 exec
函数后可以根据其返回值进行不同的处理,exec
的返回值有两种,Qt
的官方文档记录的为:
QDialog::Accepted
QDialog::Rejected
Accepted
表示接受消息, Rejected
表示拒绝消息。
还是按照之前的操作,选择新建 QT Application
项目,然后创建类名为 MainWindow
, 基类选择 QDialog
, 点击创建生成 Qt
项目。然后我们添加设计师界面类,类名 MyDialog
, 基类选择 QDialog
。然后在这个 mydialog.ui
中添加两个按钮,一个是进入主界面,一个是退出程序。
在设计师界面点击 Edit Signal/Slots
信号槽的按钮,进入信号槽编辑界面, 鼠标按住退出程序按钮不松开拖动,将另一端连接到 MyDialog
对话框,QPushButton
这边信号选择 clicked()
, MyDialog
信号选择 Reject
,这样就将两个信号连接起来了,我们点击退出程序按钮,会触发 MyDialog
发送 Reject
信号,因为 MyDialog
调用 exec
后等待信号返回,此时收到 Rjected
信号,exec
就会返回 Rjected
值。
同样道理,MyDialog
发送 accetp()
信号后, exec
回值为 Accepted
。
我们点击 Edit Widget
按钮, 然后右键点击键入主界面按钮,点击进入槽,在 Qt
为我们生成的槽函数里添加 accetp()
信号发送逻辑:
void MyDialog::on_pushButton_clicked()
{
accept();
}
我们在 main
函数里调用对话框,然后根据返回值为 Accepted
,调用主窗口显示,否则直接退出:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
MyDialog dialog;
if(dialog.exec() == QDialog::Accepted){
w.show();
return a.exec();
}else{
return 0;
}
}
运行后,我们点击进入主界面按钮,界面跳转至主界面,点击退出按钮程序退出。
现在我们要实现主界面和登录界面的互相切换,我们刚才创建的对话框界面 MyDialog
界面是登录界面,主界面是 MainWindow
类。
我们在 mainwindow.ui
添加两个按钮,返回登录按钮和退出程序按钮, 再添加一个 label
表示这是主界面。
然后点击 Edit Signal/Slot
进入信号编辑界面,点击退出程序按钮不松开拖动到尾部连接 MainWindow
的主界面上,选择退出程序的 clicked()
信号,MainWindow
选择 Reject
信号,将两个信号连接起来。
然后右击登录按钮转到槽,在槽函数里添加这个逻辑:
void MainWindow::on_pushButton_clicked()
{
close();
MyDialog mydialog;
if(mydialog.exec() == QDialog::Accepted ){
this->show();
}else{
return;
}
}
点击返回登陆按钮就会 close
主窗口,但是并不是真的关闭,只是将主窗口隐藏,Qt
回收机制是所有窗口都关闭后才回收。
再次运行程序,点击进入主界面按钮就可以进入主界面,点击返回登录按钮就可以返回登录界面,可以实现两个界面的切换了。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。