使用QT-widget时多界面切换的StackedWidget方法
刚转QT没多久,项目使用widget,需要进行同窗体界面切换,于是找到一些方法,整理一下:
初写此文章时刚学嵌入式QT,使用的还是走CPU的widget,对于4.7后出现的qml还未涉及。相信肯定有更好更直观的办法,所以如果还有其他更好的方法请一定要不吝赐教!大家一起学习
:)
方法一:用 .hide() 和 .show()
这个方法比较直观,因为QWidget是所有可视控件的基类,所以由QWidget继承而来的类,都会有 ..hide()
和 .show()
一个显示,一个隐藏。
可以简单的实现界面切换。
但这个方法使用起来却有一点小瑕疵: 因为这是窗口的切换,所以在切换的时候会一跳一跳(弹出窗口的动画),非常影响观感,故在此记录第二种方法。
方法二: 使用StackedWidget(ui设计师)
这种方法可以同一个界面里,根据选择变换其他窗口:
上图出处
一般都是用代码编写ui中new一个QStackedWidget
,但是我设计ui时使用ui设计师来设计居多,故使用了工具带的那个StackedWidget
。
它长这样:
本质上和pushButton
等控件一样,哪个类新建它,它就在哪个类的内存里。
既然它可以根据用户点击\信号,显示对应的小界面,那如果我把这个控件放大到塞满整个屏幕,然后用来切换显示我想要的界面呢?
就可以丝滑的显示窗口切换了~ 因为它还是同一个窗口,所以在切换的时候不会有“窗口突然跳出来”的动画,在观感上就很舒服。
PS:灰色背景色是我自己加的,四个
pushButton
放在了widget页面的四个角,用来提示当前界面的边界在哪
使用也很简单,可以直接在ui设计师里面右键添加新页面,然后拖动添加新控件。
也可以像下面这样,新建几个页面类,然后用代码把页面添加进stackedWidget
添加、切换页面的代码:
添加页面--------------------------------------------------------
aaa test1;
bbb test2;
ui->stackedWidget->addWidget(&test1);
ui->stackedWidget->addWidget(&test2);
选择显示哪个页面-------------------------------------------------
ui->stackedWidget->setCurrentIndex(1);
ui->stackedWidget->setCurrentIndex(2);
PS: 默认当前的界面【this】是CurrentIndex(0) 第一个界面,
故根据顺序,手动添加的第二个界面就是CurrentIndex(1)。以此类推
然后就可以愉快的用stackedWidget控件直接切换页面啦~
另外需要注意的是,这个StackedWidget
组件并不会帮你自动适配要显示界面的大小,也就是说如果你像我一样用StackedWidget
显示不同功能界面,那在实际使用中对应界面注意下窗口适配(由于都从QWidget继承而来,所以有.resize
等常用成员函数):
这张图里就很清楚了,界面2很小,切换过来明显铺不满整个
stackedWidget
,实际使用中如果窗口变动要注意适配窗口大小
如果还有其他更好的方法请一定要不吝赐教!!
提一嘴,QT 中,信号与槽是否是同一条线程要看connect函数的第五个参数。
直接连接是信号发出同时 立刻执行 槽函数,跟回调类似,是在同一条线程。执行完槽函数才会继续往下执行。
队列连接发出信号后,信号会放到接收方的事件队列 等待执行 ,并不是同一条线程,等接收方空闲事件循环才会调用槽函数。
自动连接 这是默认参数,让Qt自行选择。如果信号发送方和接收方在同一线程中,就使用直接连接;否则使用队列连接。
简单理解:把直连当成同步,信号发出立刻调用槽;队列当成异步,等接收方空闲下来才会处理。(如果实在需要立刻响应,就调用QCoreApplication::processEvents())