

下面是代码截图

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class file1;
class file2;
class edit01;
class edit02;
class gjxm;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_actionshouye_triggered(); //菜单项file1
void on_actionsecond_triggered(); //菜单项file2
void on_actionedit01_triggered(); //编辑项edit01
void on_actionedit02_triggered(); //编辑项edit02
void on_actionGjXm_triggered(); //构建-构建项目
private:
Ui::MainWindow *ui;
file1* file1Widget;
file2* file2Widget;
edit01* edit1Widget;
edit02* edit2Widget;
gjxm* gjXmWidget;
QWidget* currentWidget;
void exchangedWidget(QWidget* pWidget);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qdebug.h"
#include "file1.h"
#include "file2.h"
#include "edit01.h"
#include "edit02.h"
#include "gjxm.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
,file1Widget(NULL)
,file2Widget(NULL)
,edit1Widget(NULL)
,edit2Widget(NULL)
,gjXmWidget(NULL)
,currentWidget(NULL)
{
ui->setupUi(this);
}
//切换功能列表界面
void MainWindow::exchangedWidget(QWidget* pWidget)
{
if (!pWidget || !ui->horizontalLayout) {
qWarning("切换失败:新画面为空或布局无效!");
return;
}
// 1. 移除并释放上一个画面
if (currentWidget) {
// 关键:用 removeWidget 直接解除布局与控件的关联(比 removeItem 安全)
ui->horizontalLayout->removeWidget(currentWidget);
currentWidget->hide(); // 先隐藏,避免视觉闪烁
}
// 2. 添加新画面并显示
currentWidget = pWidget;
ui->horizontalLayout->addWidget(currentWidget); // 布局自动管理控件大小
currentWidget->show(); // addWidget 可能默认隐藏,显式调用更稳妥
}
void MainWindow::on_actionshouye_triggered(){
//菜单项file1
if (file1Widget == NULL)
{
file1Widget = new file1(this);
}
exchangedWidget(file1Widget);
}
void MainWindow::on_actionsecond_triggered()
{
//菜单项file2
if (file2Widget == NULL)
{
file2Widget = new file2(this);
}
exchangedWidget(file2Widget);
}
void MainWindow::on_actionedit01_triggered()
{
//编辑项edit01
if (edit1Widget == NULL)
{
edit1Widget = new edit01(this);
}
exchangedWidget(edit1Widget);
}
void MainWindow::on_actionedit02_triggered()
{
//编辑项edit02
if (edit2Widget == NULL)
{
edit2Widget = new edit02(this);
}
exchangedWidget(edit2Widget);
}
void MainWindow::on_actionGjXm_triggered(){
if(gjXmWidget!=NULL){
delete gjXmWidget;
gjXmWidget=NULL;
}
gjXmWidget=new gjxm();
QObject::connect(gjXmWidget, &gjxm::widgetCloseClicked, [=](){
delete gjXmWidget;
gjXmWidget=NULL;
});
gjXmWidget->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
}
gjxm为点击某菜单弹框,需要重写关闭事件,对外发信号
gjxm.h
#ifndef GJXM_H
#define GJXM_H
#include <QWidget>
namespace Ui {
class gjxm;
}
class gjxm : public QWidget
{
Q_OBJECT
public:
explicit gjxm(QWidget *parent = nullptr);
~gjxm();
private:
Ui::gjxm *ui;
signals:
void widgetCloseClicked(); //无参信号
protected:
void closeEvent(QCloseEvent *event) override; // 重写关闭事件
};
#endif // GJXM_H
gjxm.cpp
#include "gjxm.h"
#include "ui_gjxm.h"
#include "QtDebug"
gjxm::gjxm(QWidget *parent) :
QWidget(parent),
ui(new Ui::gjxm)
{
ui->setupUi(this);
qDebug()<<"gjxm + + +";
}
void gjxm::closeEvent(QCloseEvent *event)
{
emit widgetCloseClicked();
}
gjxm::~gjxm()
{
qDebug()<<"gjxm ~ ~ ~";
delete ui;
}