C++Qt不用Qt工程师,用QStackedWidget完整代码实现在主窗口中用点击三个button进行三个子窗口之间进行切换,并且保证各个窗口之间不会产生冲突
时间: 2023-06-24 18:03:06 浏览: 132
下面是使用QStackedWidget实现在主窗口中用点击三个button进行三个子窗口之间进行切换的完整代码:
mainwindow.h:
```
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStackedWidget>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QStackedWidget *m_stackWidget;
};
#endif // MAINWINDOW_H
```
mainwindow.cpp:
```
#include "mainwindow.h"
#include <QPushButton>
#include <QVBoxLayout>
#include "subwidget1.h"
#include "subwidget2.h"
#include "subwidget3.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget *centralWidget = new QWidget(this);
setCentralWidget(centralWidget);
m_stackWidget = new QStackedWidget(this);
SubWidget1 *sub1 = new SubWidget1(this);
m_stackWidget->addWidget(sub1);
SubWidget2 *sub2 = new SubWidget2(this);
m_stackWidget->addWidget(sub2);
SubWidget3 *sub3 = new SubWidget3(this);
m_stackWidget->addWidget(sub3);
QPushButton *btn1 = new QPushButton("Sub Widget 1", this);
connect(btn1, &QPushButton::clicked, [=]() {
m_stackWidget->setCurrentWidget(sub1);
});
QPushButton *btn2 = new QPushButton("Sub Widget 2", this);
connect(btn2, &QPushButton::clicked, [=]() {
m_stackWidget->setCurrentWidget(sub2);
});
QPushButton *btn3 = new QPushButton("Sub Widget 3", this);
connect(btn3, &QPushButton::clicked, [=]() {
m_stackWidget->setCurrentWidget(sub3);
});
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->addWidget(btn1);
layout->addWidget(btn2);
layout->addWidget(btn3);
layout->addWidget(m_stackWidget);
centralWidget->setLayout(layout);
}
MainWindow::~MainWindow()
{
}
```
在这里,我们创建了一个MainWindow类,它继承自QMainWindow类。我们使用QStackedWidget来管理三个子窗口,每个子窗口是一个QWidget,并且使用m_stackWidget->addWidget()将它们添加到QStackedWidget中。我们还创建了三个QPushButton,用于在主窗口中切换到相应的子窗口。在每个QPushButton的clicked信号中,我们使用m_stackWidget->setCurrentWidget()将相应的子窗口设置为当前窗口。最后,我们将所有的QWidget和QPushButton添加到主窗口中,并使用QVBoxLayout对它们进行布局。
SubWidget1、SubWidget2和SubWidget3是三个子窗口的类,它们的实现类似。下面是SubWidget1的实现:
subwidget1.h:
```
#ifndef SUBWIDGET1_H
#define SUBWIDGET1_H
#include <QWidget>
class SubWidget1 : public QWidget
{
Q_OBJECT
public:
explicit SubWidget1(QWidget *parent = nullptr);
signals:
};
#endif // SUBWIDGET1_H
```
subwidget1.cpp:
```
#include "subwidget1.h"
#include <QLabel>
#include <QVBoxLayout>
SubWidget1::SubWidget1(QWidget *parent) : QWidget(parent)
{
QLabel *label = new QLabel("This is Sub Widget 1", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(label);
setLayout(layout);
}
```
我们只需要在SubWidget1的构造函数中添加一个QLabel,用于显示当前窗口的名称。
其他两个子窗口的代码类似,只需要根据需要修改它们的内容即可。
阅读全文