QStackedWidget理论总结
- 1. 简述
- 2. 布局用法
- 3. 页面切换
- 4. 常用功能
1. 简述
QStackedWidget和QTabWidget的功能类似,都是为解决大量的控件在一个页面上可能显示不出来,同时呢,这些控件也可以按一定方式分类,我们就可以把这些控件分布在不同的页面,每次用户就操作少量的控件,更方便和科学。这个控件是建立在QStackedLayout类之上的容器,但是在QStackedWidget的内部页面上需要自己手动布局的,并不会自动给你布局。
QStackedWidget 其实就是 一个堆栈的页面,内部的页面是有顺序的,每个页面都是QWIdget类型。
在每个页面上可以采用布局的方式来自适应调整本页面上控件大小和位置,也可以不布局直接用绝对定位的方式固定好本页面上的控件大小位置。
2. 布局用法
QWidget *firstPageWidget = new QWidget;
QWidget *secondPageWidget = new QWidget;
QWidget *thirdPageWidget = new QWidget;
QPushButton *btn1 = new QPushButton("Btn1", firstPageWidget);
QPushButton *btn2 = new QPushButton("Btn2", secondPageWidget);
QPushButton *btn3 = new QPushButton("Btn3", thirdPageWidget);
//给页面1添加布局并把按钮放到布局里
QVBoxLayout * layout_1 = new QVBoxLayout;
firstPageWidget->setLayout(layout_1);
layout_1->addWidget(btn1);
//给页面2添加布局并把按钮放到布局里
QVBoxLayout * layout_2 = new QVBoxLayout;
secondPageWidget->setLayout(layout_2);
layout_2->addWidget(btn2);
//给页面3添加布局并把按钮放到布局里
QVBoxLayout * layout_3 = new QVBoxLayout;
thirdPageWidget->setLayout(layout_3);
layout_3->addWidget(btn3);
QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(firstPageWidget);
stackedWidget->addWidget(secondPageWidget);
stackedWidget->addWidget(thirdPageWidget);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(stackedWidget);
//其实隐藏了 this 指针,和 this->setLayout(layout); 等效
setLayout(layout);
效果其实就像下面
3. 页面切换
和QTabWidget 有些区别就是,QStackedWidget只是一个堆栈窗口,没有这种切换的外部表现形式,没有外部表现的形式的话,我们一般会用 像 QComboBox (下拉框) 和 QListWidget(列表框)来存储这个 QStackedWidget 的页面标题呀,再通过一定的方式把标题和页面管理起来,一般就是通过 QStackedWidget 的 页面位置关联,也可以通过 QWidget *widget 指针来关联。关联其实就是说,通过QComboBox 或者QListWidget 的某些属性 在一个方式下能和QStackedWidget的页面匹配就行。
下面就是利用的QComboBox 的item 项的位置和 QStackedWidget 的页面位置一一匹配的。来切换的
QComboBox *pageComboBox = new QComboBox;
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
connect(pageComboBox, QOverload<int>::of(&QComboBox::activated),
stackedWidget, &QStackedWidget::setCurrentIndex);
效果如下
我之前的一个用按钮做的菜单切换页面功能,用的索引方式有些不同,我是动态查询的方式完成的,也是用的 QStackedWidget 完成的,只是页面没布局而已。
菜单切换
详见:Qt 自定义侧边菜单栏切换内容页面
4. 常用功能
indexOf() 函数返回该列表中 页面的索引。
可以使用 addWidget() 函数将 页面添加到列表的末尾,也可以使用 insertWidget() 函数插入给定索引处。
removeWidget() 函数从堆叠的 widget 中删除一个 页面。
QStackedWidget中包含的 页面数量可以使用 count() 函数获得。
这个是最常用的:
- widget() 函数返回给定索引位置的 页面。
- 屏幕上显示的 页面的索引由currentIndex()给出,可以使用setCurrentIndex()进行更改。以类似的方式,可以使用currentWidget()函数检索当前显示的页面,并使用setCurrentWidget()函数进行更改。
每当QStackedWidget中的当前 页面 发生更改或从QStackedWidget中删除 页面 时,都会分别发出 currentChanged() 和 widgetRemoved() 信号。