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;
}
相关推荐
隐积7 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
名字还没想好☜10 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏11 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
酷在前行12 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
cxr82812 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
废弃的小码农13 小时前
功能测试--Day07--Python编程基础
开发语言·python
fengci.14 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
程序员zgh14 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++
念何架构之路14 小时前
restartmanager-重启管理子系统
java·开发语言
SomeB1oody15 小时前
【RustyML入门】2.0. 经典机器学习
开发语言·后端·机器学习·rust·教程