Qt菜单项切换主界面


下面是代码截图

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;
}
相关推荐
码不停蹄的玄黓19 分钟前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的22 分钟前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪26 分钟前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
_童年的回忆_1 小时前
【php】在linux下PHP安装amqp扩展
linux·开发语言·php
AIMath~2 小时前
python中的uv命令揭秘
开发语言·python·uv
弹简特2 小时前
【零基础学Python】06-Python模块和包、异常处理、文件常用操作
开发语言·python
x***r1512 小时前
Postman-win64-7.2.2-Setup安装步骤详解(附API接口测试与参数配置教程)
开发语言·lua
念恒123062 小时前
Python 面向对象编程核心:对象、实例化、封装与变量作用域
开发语言·python
大菜菜小个子2 小时前
template<typename T>使用
java·开发语言·算法
L_09072 小时前
【C++】C++11 新特性
开发语言·c++