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;
}
相关推荐
码界奇点8 小时前
基于Golang与Vue3的全栈博客系统设计与实现
开发语言·后端·golang·车载系统·毕业设计·源代码管理
呆子罗8 小时前
原生JS请求API
开发语言·javascript·ecmascript
AI视觉网奇8 小时前
Meta-Llama-3.1-8B-bnb-4bit 下载加载
linux·开发语言·python
赵谨言8 小时前
基于OpenCV的人脸五官识别系统研究
大数据·开发语言·经验分享·python
Elnaij8 小时前
从C++开始的编程生活(15)——模板知识补充
开发语言·c++
gaize12138 小时前
如何配置一个!P地址和子网掩码?
开发语言·php
csbysj20208 小时前
广度优先遍历与最短路径
开发语言
Elnaij8 小时前
从C++开始的编程生活(16)——继承
开发语言·c++
纵有疾風起8 小时前
【C++11深度解析(2)】从新增类功能到智能指针的现代 C++ 核心新特性
开发语言·c++·经验分享·开源