Qt中点击pushButton按钮实现切换父子界面

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

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt Designer实现界面切换,可以通过以下步骤: 1. 在Qt Designer设计两个或多个需要切换界面,每个界面作为一个QWidget。 2. 在第一个界面添加一个QPushButton,并在其clicked信号上连接一个槽函数。 3. 在槽函数使用QStackedWidget控件来实现界面切换。QStackedWidget控件可以在运行时动态地添加和删除QWidget,而且只会显示当前活动的QWidget。 4. 在槽函数,使用setCurrentIndex()函数设置QStackedWidget控件当前显示的QWidget索引号,以实现界面切换。 以下是一个示例代码,其有两个QWidget界面,分别命名为page1和page2,通过一个QPushButton实现从page1切换到page2: ```python from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QMainWindow, QApplication, QStackedWidget from ui_page1 import Ui_Page1 from ui_page2 import Ui_Page2 class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) # create QStackedWidget and add the pages self.stackedWidget = QStackedWidget() self.page1 = Ui_Page1() self.page2 = Ui_Page2() self.stackedWidget.addWidget(self.page1) self.stackedWidget.addWidget(self.page2) # set the central widget to the stacked widget self.setCentralWidget(self.stackedWidget) # connect button clicked signal to slot function self.page1.pushButton.clicked.connect(self.switchPage) @pyqtSlot() def switchPage(self): # switch to page2 self.stackedWidget.setCurrentIndex(1) ``` 注意,在此示例,使用了两个单独的UI文件,分别为ui_page1.py和ui_page2.py,需要在代码导入这些文件并将它们添加到QStackedWidget

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值