QStackedLayout、QStackedWidget 二者的区别?
QStackedLayout
和 QStackedWidget
都是 Qt 中用于管理多个页面(或窗口部件)的类,但它们在使用方式和功能上有一些区别。以下是它们的主要区别:
1. 使用方式
-
QStackedLayout
:- 是一个布局管理器,用于在同一个位置显示多个窗口部件。
- 通常用于动态管理一组窗口部件,这些窗口部件可以是任意类型的
QWidget
。 - 通过
QStackedLayout
,你可以将多个窗口部件堆叠在一起,并通过索引切换显示的窗口部件。
-
QStackedWidget
:- 是一个容器控件,用于在同一个位置显示多个页面。
- 每个页面是一个
QWidget
,但QStackedWidget
提供了更高级的接口来管理这些页面。 - 通常用于创建多页的用户界面,例如选项卡或向导。
2. 功能
-
QStackedLayout
:- 提供了基本的堆叠布局功能。
- 通过
setCurrentIndex(int index)
或setCurrentWidget(QWidget *widget)
方法切换显示的窗口部件。 - 适用于需要动态管理多个窗口部件的场景。
-
QStackedWidget
:- 提供了更高级的功能,例如:
addWidget(QWidget *widget)
:添加一个页面。removeWidget(QWidget *widget)
:移除一个页面。setCurrentIndex(int index)
或setCurrentWidget(QWidget *widget)
:切换显示的页面。count()
:获取页面的数量。widget(int index)
:获取指定索引的页面。
- 适用于需要管理多个页面的场景,例如选项卡或向导。
- 提供了更高级的功能,例如:
3. 示例代码
使用 QStackedLayout
的示例
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QStackedLayout>class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QStackedLayout *stackedLayout = new QStackedLayout(centralWidget);QWidget *page1 = new QWidget(this);QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("This is Page 1", page1);layout1->addWidget(label1);page1->setLayout(layout1);QWidget *page2 = new QWidget(this);QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("This is Page 2", page2);layout2->addWidget(label2);page2->setLayout(layout2);stackedLayout->addWidget(page1);stackedLayout->addWidget(page2);QPushButton *button1 = new QPushButton("Show Page 1", this);QPushButton *button2 = new QPushButton("Show Page 2", this);QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);mainLayout->addLayout(stackedLayout);mainLayout->addWidget(button1);mainLayout->addWidget(button2);connect(button1, &QPushButton::clicked, this, [this]() {stackedLayout->setCurrentIndex(0);});connect(button2, &QPushButton::clicked, this, [this]() {stackedLayout->setCurrentIndex(1);});}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
使用 QStackedWidget
的示例
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QStackedWidget>class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QStackedWidget *stackedWidget = new QStackedWidget(centralWidget);QWidget *page1 = new QWidget(this);QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("This is Page 1", page1);layout1->addWidget(label1);page1->setLayout(layout1);QWidget *page2 = new QWidget(this);QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("This is Page 2", page2);layout2->addWidget(label2);page2->setLayout(layout2);stackedWidget->addWidget(page1);stackedWidget->addWidget(page2);QPushButton *button1 = new QPushButton("Show Page 1", this);QPushButton *button2 = new QPushButton("Show Page 2", this);QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);mainLayout->addWidget(stackedWidget);mainLayout->addWidget(button1);mainLayout->addWidget(button2);connect(button1, &QPushButton::clicked, this, [this]() {stackedWidget->setCurrentIndex(0);});connect(button2, &QPushButton::clicked, this, [this]() {stackedWidget->setCurrentIndex(1);});}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
4. 总结
-
QStackedLayout
:- 适用于需要动态管理多个窗口部件的场景。
- 提供了基本的堆叠布局功能。
- 更灵活,可以嵌入到其他布局中。
-
QStackedWidget
:- 适用于需要管理多个页面的场景,例如选项卡或向导。
- 提供了更高级的接口来管理页面。
- 更方便,提供了更多的功能和方法。
根据你的具体需求选择合适的类。如果你需要更高级的页面管理功能,建议使用 QStackedWidget
。如果你需要更灵活的布局管理,可以使用 QStackedLayout
。