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;
}
相关推荐
泡海椒16 分钟前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)39 分钟前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
2501_933670791 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
菜鸟~noob2332 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium
白远山2 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
shmily麻瓜小菜鸡4 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
三克的油4 小时前
java-学习1
java·开发语言·学习
星期八不上发条4 小时前
智能指针是什么?使用场景,循环引用解决办法,面试回答
开发语言·c++·stl
OKkankan5 小时前
Python 基础进阶(三):从函数、类到 asyncio 与 FastAPI 后端开发实战
开发语言·python
泡海椒5 小时前
jquick-pdf 防止 PDF 内容分页断裂:keepTogether 属性妙用
java·开发语言·pdf