第25课 布局管理器(四)

1. 栈式布局管理器(QStackedLayout)

(1)所有组件在垂直于屏幕的方向上被管理

(2)每次只有一个组件会显示在屏幕上(类似于窗口的Z-Order,但只能显示最顶层的)

(3)只有最顶层的组件会被最终显示

2. 栈式布局管理器的特点

(1)组件大小一致且充满父组件的显示区

(2)不能直接嵌套其它布局管理器,但可以将一些组件放入一个layout,再将这个layout作为一个Widget的布局管理器。最后通过QStackedLayout.addWidget以达到嵌套的目的。

(3)能够自由切换需要显示的组件

(4)每次能且仅能显示一个组件

3. QStackedLayout的用法概要

(1)int addWidget(QWidget* widget);

(2)QWidget* currentWidget();

(3)void setCurrentIndex(int index);

(4)int currentIndex();

4. 计时器的概念及用法:

(1)计时器的概念

  ①计时器是工程开发中非常重要的角色

  ②计时器用于每隔一定的时间触发一个消息

  ③计时器消息最终会被转化为函数调用

  ④宏观上,计时器在每个时间间隔会调用指定的函数

(2)使用方法

  ①编写计时器消息处理函数

  ②在程序中创建计时器对象

  ③连接计时器消息和消息处理函数

  ④设置计时器时间间隔并启动计时

【编程实验】栈式布局和计时器的使用

        

//main.cpp

#include <QApplication>
#include "Widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

//Widget.h

#ifndef _WIDGET_H_
#define _WIDGET_H_

#include <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_H_

//Widget.cpp

#include "Widget.h"
#include <QStackedLayout>
#include <QHBoxLayout>
#include <QTimer>
#include <QDebug>

Widget::Widget(QWidget* parent):QWidget(parent),
    TestBtn1(this),TestBtn2(this),TestBtn3(this),TestBtn4(this)
{
   initControl();
}

void Widget::initControl()
{
    QStackedLayout* sLayout = new QStackedLayout();
    QHBoxLayout* hLayout = new QHBoxLayout();
    QWidget* widget = new QWidget();
    QTimer* timer = new QTimer(this);

    TestBtn1.setText("1st Button");
    TestBtn2.setText("2nd Button");
    TestBtn3.setText("3rd Button");
    TestBtn4.setText("4rd Button: Hello World!");

    //为了达到QStackedLayout可嵌套,先新成一个新的Widget
    //里面包含2个Button,并做水平布局排放
    TestBtn2.setParent(widget);
    TestBtn3.setParent(widget);

    hLayout->addWidget(&TestBtn2);
    hLayout->addWidget(&TestBtn3);
    widget->setLayout(hLayout);

    //生成栈式布局的各个组件
    sLayout->addWidget(&TestBtn1); //0
    sLayout->addWidget(widget);    //1,嵌套的widget
    sLayout->addWidget(&TestBtn4); //2

    sLayout->setCurrentIndex(0);

    setLayout(sLayout);

    connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeout()));

    timer->start(2000);

}

void Widget::timerTimeout()
{
    //取出Widget当前的布局管理器
    QStackedLayout* sLayout = dynamic_cast<QStackedLayout*>(layout());

    if(sLayout != NULL)
    {
        int index = (sLayout->currentIndex() + 1) % sLayout->count();

        sLayout->setCurrentIndex(index);
    }
}

Widget::~Widget()
{

}

5. 小结

(1)QStackedLayout以栈的方式管理界面组件

(2)QStackedLayout中的组件最多只有一个显示

(3)QStackedLayout可以自由切换需要显示的组件

(4)QTimer是Qt中的计时器组件

(5)QTimer能够在指定的时间间隔触发消息

时间: 2024-08-04 14:57:44

第25课 布局管理器(四)的相关文章

第22课 布局管理器(一)

1. 绝对定位及存在的问题 (1)直接在像素级指定各个组件的位置和大小 void QWidget::move(int x, int y) void QWidget::resize(int w, int h); (2)存在问题:组件的位置和大小无法自适应父窗口的变化 2. 布局管理器 (1)提供相关的类对界面组件进行布局管理 ①能够自动排列窗口中的界面组件 ②窗口变化后自动更新界面组件的大小 (2)QLayout是Qt中布局管理器的抽象基类 (3)通过继承QLayout实现了功能各异且互补的布局管

第23课 布局管理器(二)

1. 布局管理器中的比例系数 (1)默认情况下以等比例的方式更新组件大小 (2)可以自定义组件大小更新时的比例系数 2. QBoxLayout中的比例系数设置 (1)void setStretch(int index, int stretch); //设置指定索引对象的比例系数 (2)bool setStretchFactor(QWidget* widget, int stretch); (3)bool setStretchFactor(QLayout* layout, int stretch)

第24课 布局管理器(三)

1. 登录界面的几种实现 (1)绝对定位组件的坐标和大小 (2)嵌套QBoxLayout (3)创建3×2的QGridLayout [实例分析]QGridLayout的实现示例 2. QFormLayout布局管理器 (1)以表单(Form)的方式管理界面组件 (2)表单布局中的标签和组件是相互对应的关系 (3)表单布局支持嵌套,其它布局管理器可以作为子布局被其管理 (4)QFormLayout的用法概要 ①void addRow(QWidget* label, QWidget* field);

第二十五课、布局管理器(四)

一.栈式布局管理器 1.栈式布局管理器(QStatckedLayout)概要 (1).所有组件垂直于屏幕的方向上被管理 (2).每次只有一个组件会显示在屏幕上 (3).只有最顶层的组件会被最终显示 2.栈式布局管理器的特点 (1).组件大小一致且充满父组件的显示区 (2).不能直接嵌套其它布局管理器(可以依赖中间组件间接嵌套) (3).能够自由切换需要显示的组件 (4).每次能且仅能显示一个组件 3.QStatckedLayout的用法概要 二.计时器 1.计时器的概念 (1).计时器是工程开发

第二十四课、布局管理器(三)

一.如何实现下面的用户界面 1.解决方法 (1).绝对定位组件的坐标和大小 (2).嵌套QBoxLayout (3).创建3x2的QGridLayout 编程实验:  Widget.h  Widget.cpp  main.cpp 二.QFormLayout布局管理器 1.以表单(Form)的方式管理界面组件 2.表单布局中的标签和组件是相互对应的关系 3.QFormLayout的用法概要          4.QFormLayout的样式函数    5.表单布局支持嵌套,其它布局管理器可以作为子

Qt学习四 - 布局管理器

开发界面程序,一定会涉及到布局的问题.我们需要让控件显示在理想中的位置,可以直接设置控件的坐标和宽高.但是这样带来一个问题,当用户改变窗口大小时,例如点击最大化按钮或者拖拽窗口边缘,控件是不会改变的(包括控件的坐标和宽高).因为在窗口改变时,你没有告诉程序是否更新控件以及如何更新.如果需要让控件自动更新,那么就要自己来写一些函数来相应这些变化.针对这种情况,Qt提供了一种机制 - 布局,来解决这个问题(大部分用于开发界面程序的语言或者框架,都会提供类似的机制).只需要将控件放入某一种布局,当位置

JAVA学习笔记(四十五) - 布局管理器

FlowLayout流式布局管理器 /* * FlowLayout流式布局管理器 */ public class Test03 { public static void main(String[] args) { Frame frame=new Frame("My Frame"); Button btn1=new Button("按钮1"); Button btn2=new Button("按钮2"); Button btn3=new Butto

2.2UI组件(一)布局管理器

所有的布局管理器都是ViewGroup的子类. 2.2.1线性布局LinearLayout android:orientation:可以控制竖排显示(vertical)或者横排显示(horizontal) LInearLayout不会自动换行,一旦屏幕排满之后后面的控件将看不到 基本上很多布局管理器都提供了相应的LayoutParams内部类,该内部类用于控制他们的子元素使他们都具有android:layout_gravity属性,概述性设置子元素在父容器 中的对齐方式 例子 1 <?xml v

AWT布局管理器

布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ①   FlowLayout 流式布局管理器 ②   BorderLayout 边界布局管理器 ③   GridLayout 网格布局管理器 ④   CradLayout 卡片布局管理器 ⑤   GridBagLayout 网格包布局管理器 容器中组件的布局通常由布局管理器控制.每个Container(比如一个Panel或一个Frame)都有一个与他相关的缺省布局管理