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 分钟前
java 通过Minio上传文件
java·开发语言
m0_5613596720 分钟前
基于C++的机器学习库开发
开发语言·c++·算法
星空露珠27 分钟前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
2401_8324027528 分钟前
C++中的类型擦除技术
开发语言·c++·算法
努力学习的小廉36 分钟前
我爱学算法之—— 递归回溯综合(二)
开发语言·算法
sheji526138 分钟前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_7634724638 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
毕设源码-邱学长39 分钟前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
程序员清洒44 分钟前
Flutter for OpenHarmony:Text — 文本显示与样式控制
开发语言·javascript·flutter
qq_397562311 小时前
QT工程 , 生成别的电脑运行的exe程序
嵌入式硬件·qt