本文学习自 狄泰软件 唐佐林老师的 QT。
应用场景:如桌面系统 安装程序 的上一步 下一步等等。嵌入式设备中的左滑 右滑等等 都是用的栈式布局管理器QStackedLayout
addWidget() : 向布局管理器添加需要管理的组件
currentWidget(): 得到当前显示在屏幕上面的组件是哪一个,即返回当前栈式布局管理器最顶层的组件
setCurrentIndex(): 设置当前应该显示的组件,通过组件下标设置
currentIndex() : 获取当前显示的组件下标
实验:
Widget.h
#ifndef _WIDGET_H_
#define _WIDGET_H_
#include <QtGui/QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
private:
QPushButton TestBtn1;
QPushButton TestBtn2;
QPushButton TestBtn3;
QPushButton TestBtn4;
void initControl();
private slots:
void timerTimeout();//计数器消息处理
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif
Widget.cpp
#include "Widget.h"
#include <QStackedLayout>
#include <QHBoxLayout>
#include <QtCore>
#include <QDebug>
Widget::Widget(QWidget *parent) : QWidget(parent),
TestBtn1(this), TestBtn2(this), TestBtn3(this), TestBtn4(this)
{
initControl();
}
void Widget::initControl()
{
//创建栈式布局管理器QStackedLayout 对象
QStackedLayout* sLayout = new QStackedLayout();
//创建水平布局管理器QHBoxLayout 对象
QHBoxLayout* hLayout = new QHBoxLayout();
//创建QWidget组件对象
QWidget* widget = new QWidget();
//创建QTimer计时器对象 指定父组件
QTimer* timer = new QTimer(this);
//设置标签
TestBtn1.setText("1st Button");
TestBtn2.setText("2rd Button");
TestBtn3.setText("3th Button");
TestBtn4.setText("Test Button 4: D.T.Software");
//设置TestBtn2 TestBtn3 的父组件为 widget组件
TestBtn2.setParent(widget);
TestBtn3.setParent(widget);
//水平布局管理器对象hLayout 管理 TestBtn2 TestBtn3
hLayout->addWidget(&TestBtn2);
hLayout->addWidget(&TestBtn3);
//将水平布局管理器hLayout 设置到 widget组件当中
widget->setLayout(hLayout);
//向QStackedLayout栈式布局管理器 加入组件 TestBtn1,下标为0
sLayout->addWidget(&TestBtn1); // 0
//向QStackedLayout栈式布局管理器 加入组件 widget 下标为1
/*布局管理器之间的间接嵌套
1 完成布局管理器之间的间接嵌套,需要依赖一个中间组件widget
2 将需要嵌套的布局管理器设置到中间组件widget中,并且将嵌套的布局管理器所管理的组件 他们的父组件设置为 中间组件widget
3 最后将中间组件widget 设置到 栈式布局管理器中
*/
sLayout->addWidget(widget); // 1
//向QStackedLayout栈式布局管理器 加入组件 TestBtn4 下标为2
sLayout->addWidget(&TestBtn4); // 2
//设置当前显示的组件是哪一个,下标为1 即 widget。水平显示 TestBtn2 TestBtn3
sLayout->setCurrentIndex(1);
//将当前 栈式布局管理器QStackedLayout 设置到当前窗口,即QStackedLayout生效
setLayout(sLayout);
//信号与槽 映射,将timer计时器对象的计时器消息timeout() 连接到 消息处理函数上面(槽)
connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeout()));
//启动计数器 设置时间2S
timer->start(2000);//2s
}
//计时器消息处理函数:动态切换需要显示的组件
void Widget::timerTimeout()
{
/*
layout():直接返回当前组件所拥有的布局管理器
*/
QStackedLayout* sLayout = dynamic_cast<QStackedLayout*>(layout());
if( sLayout != NULL )
{
/*
currentIndex():获取当前显示的组件下标
sLayout->count(): 获取当前布局管理器所管理的组件数目。
*/
int index = (sLayout->currentIndex() + 1) % sLayout->count();
//设置当前显示的组件是哪一个,下标为index
sLayout->setCurrentIndex(index);
}
}
Widget::~Widget()
{
}
main.cpp
#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}