这里用到的是QWidget类中的show()和hide()函数。 比如这里我们要实现通过点击“参数设置”按钮来跳转到新的界面,并在新界面进行参数选择,如下图所示: 大致思路是通过绑定“参数设置”按钮的点击信号,将新的ui窗口show出来,原来的主程序窗口可以自行选择是否要hide。 我们在项目Forms中添加QT设计师界面类文件,并且将ui界面设置好,并在原头文件中引用这个头文件。 然后在主窗口的cpp文件里实例化这个新窗口,并在槽函数中将新窗口show出来:
void Widget::on_btn_ConfirmPosition_clicked() { NewWidget *position = new NewWidget();//在主窗口中实例化子窗口 this->hide();//this代表主窗口 position->show();//显示子窗口 }因为“参数设置”按钮是主窗口中的控件,而跳出新窗口需要用到“参数设置”的cliked信号,所以必须在主窗口中实例化新窗口。
如果说我们需要在显示新的子窗口时隐藏主窗口,然后在关闭子窗口时恢复主窗口,需要怎么做呢? 我第一时间想到的是在子窗口的cpp文件中实例化主窗口,然后和上文做同样的操作:
#include "widget.h" ... void NewWidget::on_btn_Return_clicked() { Widget *widget = new Widget(); this->close(); widget->show(); }乍一看,这么写是没什么问题的,但是编译时会报错。原因是我们在主窗口widget.h中已经引用过子窗口的newwidget.h文件了,如果说又在子窗口中再次引用widget头文件,编译就会报错。可是,如果说子窗口中不引用主窗口的头文件,那就无法在子窗口中调用主窗口的函数,也就无法直接控制主窗口的状态了。 这个问题在网上找到了解决方法,我们可以给子窗口写一个自定义信号,当子窗口关闭时,发出这个信号,并且在主窗口中用槽函数绑定这个信号,这样就可以通过信号来间接控制主窗口的状态了:
//在子窗口的头文件中定义信号 signal: void ConfirmPosition_closed();//信号是不需要再次拿出来声明的 private signals: void btn_Return_clicked(); //在子窗口的cpp文件中 void NewWidget::on_btn_Return_clicked() { this->closed(); emit this->ConfirmPosition_closed();//关闭时发出信号 } //在主窗口的cpp文件中 void Widget::on_btn_ConfirmPosition_clicked() { NewWidget *position = new NewWidget(); this->hide(); position->show(); //子窗口打开时就监听其关闭信号,信号触发时重新显示主窗口 //也可以根据需要加入其他功能 connect(position,&NewWidget::ConfirmPosition_closed,this,[=](){ this->show(); }); }另外我在修改界面时新加入了几个界面,一共是5个子窗口,一个主窗口。我在构架函数时直接把所有窗口全部实例化,然后在不同按钮的槽函数中执行hide、show操作,这时候经常会碰到程序崩溃的问题。后来把实例化放到了对应的槽函数里,就不会有这种现象了,我猜大概是因为内存泄漏导致的,这也是平时需要注意的问题。