QT 通过信号槽实现页面跳转功能(QMainWindow)2020-12-14 00:40:24

( 1人已投票,[高质量] )
分享:
31.3K

网上也看了很多,不是太啰嗦,就是绕弯,Qt的页面跳转这是一个很常用的功能,为什么这么复杂,我下面就来全新讲解一下,该如何在login界面与主界面之间跳来跳去。

首先,login是默认创建的界面是也是基于QMainWindow的,其实基于Dialog的也一回事,只是继承没事,对实现跳转没影响,所以不考虑,有你就用。生成项目本身就有一个界面了(.ui),我们需要再建一个界面,上面放一个按纽,然后转到槽函数(新建界面方法:右键工程包add new选择QT=》设计师界面,我取名为work)


现在有了两个界面了(main.cpp Login.cpp work.cpp)这个结构是基础,我就不讲了,你根我名字不一样,没关系的,后面改为你的就行了,举一返三


用槽来实现,我说一下全部的步骤,也是QT的核心内容

页面跳过去需要信(暗)号与响应函数。由于还要跳回来,所以需要一对数据!

我随便自定义了,名字随便起:


signals:
void JumptoWork(); //定义在Login.h中,信号都不用实现,写在里就行,记得signals
void JumptoLogin(); //定义在work.h中,信号都不用实现,写在里就行,记得signals
private slots:
void OpenWork(); //定义在work.h中,槽需要实现,可以右键refactor=>在work.cpp中定义
void OpenLogin(); //定义在Login.h中,槽需要实现,可以右键refactor=>在login.cpp中定义


以上的代码就是第一步,注意分开放在对应的.h中而不是cpp中,因为要跳回来还要跳回去,所以代码量是二倍了,就这几句话,这个工作做好之后,QT天天吹嘘的核心内容-信号槽 ,已经被你学一半了


接下来-绑定连接信号与响应

在main.cpp中(main入口函数,仔细看,默认启动的login界面,也是它原来就生成好了的,就那几句话仔细看,学习一下)


LoginWindow login;//这句函数本来就有
WorkWindow work;//记得包含头文件
login show();//这句函数本来就有
QObject::connect(&login,SIGNAL(JumptoWork()),&work,SLOT(OpenWork()));
QObject::connect(&w2,SIGNAL(JumptoLogin()),&login,SLOT(OpenLogin()));

return a.exec();//这句话是定位用的,放在他之前吧,往后放保险,QT有未知名的bug,我说个坑,虽然能用,比如,数据库的初始化如果不放在QApplicationa(argc,argv);这句之后,运行没问题,打包后会出问题,我就踩了这个坑,我大意了,没有闪


以上代码是只我的例子,如果名称不一样,要改为你自己的!

这其实就三句话:login是默认定义过了的,一个定义了work(记得顶上包含work.h),两个连接函数,就是跳过去与跳过来谁来负责的意思

QObject::connect可以看函数原型,里面前四个参数的意思是,谁发、发什么信号、谁收、收函数是什么)

也就是界面在加载完成后(main.cpp),就定义了逻辑,现在还与页面跳转没关系,(其实你可以运行一下了,先按我说的来,修正到没有语法错误为止)


添加跳转

看到上面说的两个 定义在xxx.h中,槽需要实现,可以名键refactor=>在work.cpp中定义 了吗

分别进入Login.cpp与work.cpp中,对应两个槽函数(OpenLogin()和OpenWork())进行功能添加,很简单就一句话

this->show();


添加触发条件,现在是可以“转移信号映射”到对应的函数了,函数也实现跳转了,但是什么时机由谁来发送这个signal还是没定下来,仔细想想是不是?

我的login界面上有个登录,我的work界面有个返回按纽,如果这个也不会,我就为新手科普一下,高手请略过后面的扩号(双击项目=>Forms=>对应的ui文件,接着左边到到Push Button按住往后边拖,就放上去了,双击改个名啥,然后,右键按纽=》转到槽=》OnClicked()就跳到了对应的函数了,学吧,这个操作以后会用到你手麻,没办法)


在函数中,登录按纽肯定是判断条件后要跳转的,返回按纽也是跳转的,代码很简单

emit JumptoWork();//跳哪个要记得,有点绕人但是写错了会报错的,没事,放心写
this->hide();//隐藏就行了

同理work中返回

emit JumptoLogin();
this->hide();


至此,实现完毕,想用信号槽的方式,我这是精简的不能再精简了,少一步,逻辑就有问题,但是如果你有耐心跟着我梳理了一遍,你会对信号槽有全新的认识,学到的不只是页面跳转。


无图无真相,上图,有疑问请留言。。。

QT 通过信号槽实现页面跳转功能(QMainWindow)

特别说明:可以用this->close();取代hide() (注意两者不会调用析构函数)。而且多个mainWindow也可以并存的,不是非得把一个mainWindow hide,才可以调用另一个mainWindow的show,效果类似模态对话框。这两点是特此来更新的,该观点经过我的实测检验,与大部分的网上内容不符,读者要留心验证// QT5.14


如果结束生命周期式的跳转,要留意一下绑定函数的生命周期情况,做到心里有数,最后说一下,connect的最后一个参数,Qt::UniqueConnection 加上就是绑定队列中防重复,而不是会在某种情况可能会被多次调用,这块文档中有说明






  • 花花世界的头像
    花花世界 - 2021-01-05 13:00:51

    还有一种方法,不用信号槽,而改用静态方法实现界面间互相跳转,详见下一篇内容哦~

    花花世界的头像

    X
头像

snowcoal
  • QT
  • 信号槽
  • 页面跳转

本文标签:

QT信号槽页面跳转

收藏到我的私密空间

标题:QT 通过信号槽实现页面跳转功能(QMainWindow)

作者:花花世界

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限

如果本站的内容有幸帮助到了您,建议您了解一下当页的广告内容哦,我们的进步离不开您的支持,Thank you~