1 Star 11 Fork 6

胡歌-此生不换/Qt-Project

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

QT 模态对话框消息传递

通过 ui 文件,不用 connect 来连接的方式看着实现很便捷,但是文件多了的时候就很乱,不知道谁连接的谁......

connect 的方式看起来有理有据,条理清晰,文件多的时候,也是不知道在什么文件里用了的......

1. 模态对话框接受和拒绝消息

我们创建一个模态对话框,调用 exec 函数后可以根据其返回值进行不同的处理,exec 的返回值有两种,Qt 的官方文档记录的为:

QDialog::Accepted
QDialog::Rejected

Accepted 表示接受消息, Rejected 表示拒绝消息。

还是按照之前的操作,选择新建 QT Application 项目,然后创建类名为 MainWindow, 基类选择 QDialog, 点击创建生成 Qt 项目。然后我们添加设计师界面类,类名 MyDialog, 基类选择 QDialog。然后在这个 mydialog.ui 中添加两个按钮,一个是进入主界面,一个是退出程序。

Alt text

在设计师界面点击 Edit Signal/Slots 信号槽的按钮,进入信号槽编辑界面, 鼠标按住退出程序按钮不松开拖动,将另一端连接到 MyDialog 对话框,QPushButton 这边信号选择 clicked()MyDialog 信号选择 Reject,这样就将两个信号连接起来了,我们点击退出程序按钮,会触发 MyDialog 发送 Reject 信号,因为 MyDialog 调用 exec 后等待信号返回,此时收到 Rjected 信号,exec 就会返回 Rjected 值。

Alt text

同样道理,MyDialog 发送 accetp() 信号后, exec 回值为 Accepted

Alt text

我们点击 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;
    }
}

运行后,我们点击进入主界面按钮,界面跳转至主界面,点击退出按钮程序退出。

2. 主界面和登录界面切换

现在我们要实现主界面和登录界面的互相切换,我们刚才创建的对话框界面 MyDialog 界面是登录界面,主界面是 MainWindow 类。

我们在 mainwindow.ui 添加两个按钮,返回登录按钮和退出程序按钮, 再添加一个 label 表示这是主界面。

然后点击 Edit Signal/Slot 进入信号编辑界面,点击退出程序按钮不松开拖动到尾部连接 MainWindow 的主界面上,选择退出程序的 clicked() 信号,MainWindow 选择 Reject 信号,将两个信号连接起来。

Alt text

然后右击登录按钮转到槽,在槽函数里添加这个逻辑:

void MainWindow::on_pushButton_clicked()
{
    close();
    MyDialog mydialog;
    if(mydialog.exec() == QDialog::Accepted ){
        this->show();
    }else{
        return;
    }
}

点击返回登陆按钮就会 close 主窗口,但是并不是真的关闭,只是将主窗口隐藏,Qt 回收机制是所有窗口都关闭后才回收。

再次运行程序,点击进入主界面按钮就可以进入主界面,点击返回登录按钮就可以返回登录界面,可以实现两个界面的切换了。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ax020913/qt-project.git
git@gitee.com:ax020913/qt-project.git
ax020913
qt-project
Qt-Project
master

搜索帮助