You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt新手求助:绘图类应用右侧QGridLayout内容切换实现代码

Qt Panel Content Switching for Your Drawing App

Hey there! As a Qt developer who’s built similar panel-switching UIs before, I’ll walk you through a straightforward implementation that fits your exact requirements. Let’s start with a core approach using component visibility control, then show a more scalable method for larger, more complex apps.

First, Let’s Outline the Setup

We’ll build a main window with:

  • A left QGroupBox holding 4 push buttons (for your 4 scenarios)
  • A right panel using QGridLayout to contain your drawing objects (we’ll use QLabel as stand-ins for your custom drawing components)

Step 1: Define Your Main Window Class (Header File)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGroupBox>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QList>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onButton1Clicked();
    void onButton2Clicked();
    void onButton3Clicked();
    void onButtonNClicked();

private:
    // Left panel controls
    QGroupBox* leftControlBox;
    QPushButton* btnShowNumbered;
    QPushButton* btnShowOther;
    QPushButton* btnShowBlank;
    QPushButton* btnShowAll;

    // Right panel layout and objects
    QWidget* rightContentPanel;
    QGridLayout* rightGrid;

    // Your drawing objects (replace these with your custom components)
    QList<QLabel*> numberedObjects;
    QList<QLabel*> otherObjects;
};

#endif // MAINWINDOW_H

Step 2: Implement the Main Window (CPP File)

We’ll initialize all widgets, set up the layout, connect button signals to slots, and handle the visibility logic for each scenario.

#include "mainwindow.h"
#include <QHBoxLayout>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // Set base window size
    this->resize(800, 600);

    // Create central widget and main layout
    QWidget* centralWidget = new QWidget(this);
    QHBoxLayout* mainLayout = new QHBoxLayout(centralWidget);
    this->setCentralWidget(centralWidget);

    // ----------------------
    // Left Control Panel
    // ----------------------
    leftControlBox = new QGroupBox("Scene Controls", this);
    QVBoxLayout* leftLayout = new QVBoxLayout(leftControlBox);

    btnShowNumbered = new QPushButton("Show Numbered Objects", leftControlBox);
    btnShowOther = new QPushButton("Show Other Objects", leftControlBox);
    btnShowBlank = new QPushButton("Show Blank Scene", leftControlBox);
    btnShowAll = new QPushButton("Show All Objects", leftControlBox);

    leftLayout->addWidget(btnShowNumbered);
    leftLayout->addWidget(btnShowOther);
    leftLayout->addWidget(btnShowBlank);
    leftLayout->addWidget(btnShowAll);
    leftLayout->addStretch(); // Push buttons to the top

    mainLayout->addWidget(leftControlBox);

    // ----------------------
    // Right Content Panel
    // ----------------------
    rightContentPanel = new QWidget(this);
    rightGrid = new QGridLayout(rightContentPanel);
    mainLayout->addWidget(rightContentPanel, 1); // Give more space to the right panel

    // Create numbered objects (e.g., 5 items arranged in grid)
    for(int i = 0; i < 5; i++){
        QLabel* obj = new QLabel(QString("Numbered Object %1").arg(i+1), rightContentPanel);
        obj->setStyleSheet("border: 1px solid blue; padding: 12px; font-size: 14px;");
        numberedObjects.append(obj);
        rightGrid->addWidget(obj, i/2, i%2);
        obj->hide(); // Hide by default
    }

    // Create other objects (e.g., 3 items arranged below numbered ones)
    for(int i = 0; i < 3; i++){
        QLabel* obj = new QLabel(QString("Other Object %1").arg(i+1), rightContentPanel);
        obj->setStyleSheet("border: 1px solid green; padding: 12px; font-size: 14px;");
        otherObjects.append(obj);
        rightGrid->addWidget(obj, 3 + i/2, i%2);
        obj->hide(); // Hide by default
    }

    // Connect buttons to their respective slots
    connect(btnShowNumbered, &QPushButton::clicked, this, &MainWindow::onButton1Clicked);
    connect(btnShowOther, &QPushButton::clicked, this, &MainWindow::onButton2Clicked);
    connect(btnShowBlank, &QPushButton::clicked, this, &MainWindow::onButton3Clicked);
    connect(btnShowAll, &QPushButton::clicked, this, &MainWindow::onButtonNClicked);
}

MainWindow::~MainWindow()
{
    // Qt's parent-child hierarchy handles most cleanup, add custom logic if needed
}

// ----------------------
// Slot Implementations
// ----------------------
void MainWindow::onButton1Clicked()
{
    // Hide other objects, show numbered ones
    for(auto obj : otherObjects) obj->hide();
    for(auto obj : numberedObjects) obj->show();
}

void MainWindow::onButton2Clicked()
{
    // Hide numbered objects, show other ones
    for(auto obj : numberedObjects) obj->hide();
    for(auto obj : otherObjects) obj->show();
}

void MainWindow::onButton3Clicked()
{
    // Hide all objects to show blank
    for(auto obj : numberedObjects) obj->hide();
    for(auto obj : otherObjects) obj->hide();
}

void MainWindow::onButtonNClicked()
{
    // Show all objects
    for(auto obj : numberedObjects) obj->show();
    for(auto obj : otherObjects) obj->show();
}

A More Scalable Approach: Using QStackedWidget

If your drawing scenes get more complex (e.g., each has unique layouts or dynamic components), QStackedWidget is a cleaner solution. Here’s how to adjust the setup:

Update the Header File

Add these members to your MainWindow class:

private:
    // ... existing members ...
    QStackedWidget* sceneStack;
    QWidget* numberedScene;
    QWidget* otherScene;
    QWidget* blankScene;
    QWidget* allObjectsScene;

Replace the Right Panel Initialization

Swap the right panel code in the constructor with this:

// ----------------------
// Right Panel with QStackedWidget
// ----------------------
sceneStack = new QStackedWidget(this);
mainLayout->addWidget(sceneStack, 1);

// Scene 1: Numbered Objects
numberedScene = new QWidget();
QGridLayout* numLayout = new QGridLayout(numberedScene);
for(int i = 0; i < 5; i++){
    QLabel* obj = new QLabel(QString("Numbered Object %1").arg(i+1), numberedScene);
    obj->setStyleSheet("border: 1px solid blue; padding: 12px;");
    numLayout->addWidget(obj, i/2, i%2);
}
sceneStack->addWidget(numberedScene);

// Scene 2: Other Objects
otherScene = new QWidget();
QGridLayout* otherLayout = new QGridLayout(otherScene);
for(int i = 0; i < 3; i++){
    QLabel* obj = new QLabel(QString("Other Object %1").arg(i+1), otherScene);
    obj->setStyleSheet("border: 1px solid green; padding: 12px;");
    otherLayout->addWidget(obj, i/2, i%2);
}
sceneStack->addWidget(otherScene);

// Scene 3: Blank
blankScene = new QWidget();
sceneStack->addWidget(blankScene);

// Scene 4: All Objects
allObjectsScene = new QWidget();
QGridLayout* allLayout = new QGridLayout(allObjectsScene);
int row = 0, col = 0;
for(auto obj : numberedObjects){
    allLayout->addWidget(obj, row, col);
    col++;
    if(col == 2){ col = 0; row++; }
}
for(auto obj : otherObjects){
    allLayout->addWidget(obj, row, col);
    col++;
    if(col == 2){ col = 0; row++; }
}
sceneStack->addWidget(allObjectsScene);

// Connect buttons to switch stack indexes
connect(btnShowNumbered, &QPushButton::clicked, [this](){ sceneStack->setCurrentIndex(0); });
connect(btnShowOther, &QPushButton::clicked, [this](){ sceneStack->setCurrentIndex(1); });
connect(btnShowBlank, &QPushButton::clicked, [this](){ sceneStack->setCurrentIndex(2); });
connect(btnShowAll, &QPushButton::clicked, [this](){ sceneStack->setCurrentIndex(3); });

Key Tips for Your Drawing App

  • Replace the QLabel instances with your custom drawing components (e.g., QWidget subclasses that override paintEvent() to handle your drawing logic)
  • If you need dynamic object creation/destruction, use rightGrid->removeWidget(widget) and widget->deleteLater() when switching scenes, but pre-creating and hiding is more efficient for static content
  • Tweak layout margins, spacing, and stylesheets to make your UI feel polished and responsive

内容的提问来源于stack exchange,提问作者hemanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:07