Qt 25 布局管理器4 - 栈式布局管理器QStackedLayout,QTimer计时器

本文学习自 狄泰软件 唐佐林老师的 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();
}

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/115237596
今日推荐