这里用到的是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操作,这时候经常会碰到程序崩溃的问题。后来把实例化放到了对应的槽函数里,就不会有这种现象了,我猜大概是因为内存泄漏导致的,这也是平时需要注意的问题。