Qt 多界面来回切换的问题以及Qt界面关闭与销毁
程序员文章站
2022-05-28 11:52:17
...
Qt 中我们经常会用到好几个界面,那么这几个界面之间来回切换就是一个经常出现的问题。之前我也总是被这个问题困扰,现在写一个样例程序当作一种解决方案,希望能给大家启发。
首先我定义了两个界面,一个主界面,一个是子界面,我希望它们两个能互相切换。主界面和子界面如图所示:
子界面:
主要程序如下所示:
首先是主界面:在Mainwindow里面,当点击pushbutton之后,应该做这么几件事:第一件事是主界面消失(当然根据实际情况你也可以选择让它关闭)。第二件事是new一个子界面出来,并且让他显示。还有最重要的是定义一个信号与槽,使得在子界面点击 “转到主界面” 按钮的时候,主界面能显示。所以程序如下所示:
void MainWindow::on_pushButton_clicked()
{
this->hide();//主界面关闭
video *videodlg = new video(this);//新建子界面
connect(videodlg,SIGNAL(sendsignal()),this,SLOT(reshow()));//当点击子界面时,调用主界面的reshow()函数
videodlg->show();//子界面出现
}
对于子界面,应该做的事情是当点击 “转到主界面” 的时候,关闭子界面并且回到主界面。所以它的头函数如下:
#ifndef VIDEO_H
#define VIDEO_H
#include <QDialog>
namespace Ui {
class video;
}
class video : public QDialog
{
Q_OBJECT
public:
explicit video(QWidget *parent = 0);
~video();
private slots:
void on_pushButton_clicked();
signals:
void sendsignal();//这个函数用户向主界面通知关闭的消息
private:
Ui::video *ui;
};
#endif // VIDEO_H
子界面的.cpp如下:
#include "video.h"
#include "ui_video.h"
#include <QDebug>
video::video(QWidget *parent) :
QDialog(parent),
ui(new Ui::video)
{
ui->setupUi(this);
this->setAttribute(Qt::WA_DeleteOnClose,1);
qDebug()<<"构造了video窗口"<<endl;
}
video::~video()
{
delete ui;
}
void video::on_pushButton_clicked()
{
emit sendsignal();
this->close();
}
当点击了子界面的按钮时候,出发了sendsignal函数。首先子界面会关闭,并且这个函数会出发主界面的reshow()函数,这个函数会让主界面重新出现,这也就是两个界面来回切换的原理,多个界面的切换道理是一样的。主界面reshow()函数如下:
void MainWindow::reshow(){
this->show();
}
其实我还想说的是关于界面关闭和销毁的问题。如果读懂了上面的程序就会发现,在切换过程中,主界面是一直存在的,他只是有时候用hide()函数暂时消失;之后再用show()函数让它重新显示了。这么做的原因是我用了connect函数。第三个参数是this,this指针必须作用在当前自己上面,也就是目前必须有一个存在的mainwindow实体。所以我用的是hide函数隐藏它,而不是close函数销毁它。
但是对于子界面情况就不一样了,子界面我觉得既可以销毁也可以隐藏,这取决于实际的工程你想要怎么样,在这里我用的是销毁。每次销毁之后,当主界面点击跳转子界面的按钮的时候再进行重新构建子界面,所以我用的是close()函数。但是这里也需要用到这句话:
this->setAttribute(Qt::WA_DeleteOnClose,1);
我在销毁的时候,这个函数用于把界面的所有变量销毁,如果不想销毁就把1置位为0.所以要想好,当你的界面还有一些你需要的变量的时候,不能用这个函数了,当然初始化的时候构造函数怎么初始化变量也值得考虑,我在工程中也遇到了不少问题,不过脑子导致了错误。
总之,这里记录了关于Qt多界面来回切换的思路,如果有人觉得有更好的从一个界面跳转到另一个界面的方法一定要告诉我,谢谢了。文中还有对于界面关闭和销毁的一点看法,欢迎大家拍砖。