《Qt应用开发》笔记p2

Qt 的类的继承关系

QObject 是Qt基础类,无界面的类,他是所有窗口控件的基类,也是封装了事件等操作的类,他是QWidget的基类。

复制代码
QObject --> QWidget --> QAbstractButton
                    +--> QLabel
                    +--> QLineEdit

Qt的布局 Layout

种类

  • BoxLayout
    • 水平布局 QHBoxLayout
    • 垂直布局 QVBoxLayout
  • 网格布局 QGridLayout
  • 表单布局 QFormLayout
  • 栈布局QStackedLayout

创建方法1

在创建对象是指定此布局对象的父窗口为 当前对象:

构造方法

复制代码
QVBoxLayout(QWidget *);

创建方法2

在创建对象时不指定布局对象的父窗口,后期用setLayout指定父窗口。也可以用addWidget()增加Widget部件。

构造方法

复制代码
T * layout = new QVBoxLayout();
setLayout(layout) // 增加布局。

BoxLayout 布局的常用方法

复制代码
addWidget(QWidget *); // 防止空间
addLayout(QLayout *layout, int stretch = 0) // 放置其他布局
addStretch(); // 放置弹簧,均分剩余空间。
// 设置布局的内边距(组件与组件之间的边距)
void QBoxLayout::setSpacing(int spacing)
// 设置布局的外边距(上下左右)
void QLayout::setContentsMargins(int left, int top, int right, int bottom)

使用BoxLayout 实现登录界面的对话框

复制代码
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>

#include "loginwidget.h"

LoginWidget::LoginWidget(QWidget *parent) : QWidget(parent)
{
    QVBoxLayout *vlayout1 = new QVBoxLayout(this);

    // 用水平布局将QLabel 和 QLineEdit放在一起。
    QHBoxLayout *hlayout1 = new QHBoxLayout;
    vlayout1->addLayout(hlayout1); // 加入垂直布局
    QLabel * label = new QLabel("用户名:");
    label->setMinimumWidth(60);
    label->setAlignment(Qt::AlignRight);
    QLineEdit * lineedit = new QLineEdit();
    hlayout1->addWidget(label);
    hlayout1->addWidget(lineedit);

    // 用水平布局将QLabel 和 QLineEdit放在一起。
    QHBoxLayout *hlayout2 = new QHBoxLayout;
    vlayout1->addLayout(hlayout2); // 加入垂直布局
    QLabel * label2 = new QLabel("密码:");
    label2->setAlignment(Qt::AlignRight);
    label2->setMinimumWidth(60);
    QLineEdit * lineedit2 = new QLineEdit();
    hlayout2->addWidget(label2);
    hlayout2->addWidget(lineedit2);

    QCheckBox * checkbox = new QCheckBox("记住密码");
    vlayout1->addWidget(checkbox);

    // 注册登陆按钮
    QHBoxLayout *hlayout3 = new QHBoxLayout;
    vlayout1->addLayout(hlayout3);
    hlayout3->addWidget(new QPushButton("注册"));
    hlayout3->addWidget(new QPushButton("登陆"));
    // 设置登陆和注册的间距
    hlayout3->setSpacing(30);
    // 设置 垂直方向的间距。
    vlayout1->setSpacing(15);
    // 设置外边距。
    vlayout1->setContentsMargins(50, 50, 50, 50);
}

GridLayout 示例代码

复制代码
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTextEdit>

#include "gridlayoutwidget.h"

GridLayoutWidget::GridLayoutWidget(QWidget *parent) : QWidget(parent)
{
    // 创建一个网格布局对象
    QGridLayout * grid = new QGridLayout(this);
    QLineEdit * hideEdit = new QLineEdit;
    hideEdit->setHidden(true);  // 设之成不显示的Widget.
    grid->addWidget(new QLineEdit);
    grid->addWidget(hideEdit, 0, 1);
    grid->addWidget(new QLineEdit, 0, 2);
    // 创建TextEdit ,跨度2行 1 列
    grid->addWidget(new QTextEdit, 1, 0, 2/*行*/, 1/*列*/);
    grid->addWidget(new QTextEdit, 1, 1, 1, 2);
    grid->addWidget(new QTextEdit, 2, 1, 1, 1);
    grid->addWidget(new QTextEdit, 2, 2, 2, 1);
    grid->addWidget(new QTextEdit, 3, 0, 1, 2);

    // 设置列的占用比例
    grid->setColumnStretch(0, 1);
    grid->setColumnStretch(1, 3);
    grid->setColumnStretch(2, 1);
    // 设置行的占用比例
    grid->setRowStretch(0, 1);
    grid->setRowStretch(1, 1);
    grid->setRowStretch(2, 3);
    grid->setRowStretch(3, 1);

    QHBoxLayout * hlayout1 = new QHBoxLayout;
    hlayout1->addWidget(new QPushButton("上一步"));
    hlayout1->addWidget(new QPushButton("下一步"));
    grid->addLayout(hlayout1, 4, 0, 1, 3);
}

表单布局(QFormLayout)

复制代码
#include <QFormLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QCheckBox>
#include <QLabel>
#include <QPushButton>

#include "formlayoutwidget.h"

FormLayoutWidget::FormLayoutWidget(QWidget *parent) : QWidget(parent)
{
    QFormLayout *form = new QFormLayout;
    QLineEdit * username = new QLineEdit;
    QLineEdit * phone = new QLineEdit;
    QLineEdit * password = new QLineEdit;
    form->addRow("姓名:", username);
    form->addRow("手机号:", phone);
    form->addRow("密码:", password);
    // 加入验证码输入框和获取验证码按按钮
    QHBoxLayout * hlayout1 = new QHBoxLayout;
    QLineEdit * code = new QLineEdit;
    hlayout1->addWidget(code);
    hlayout1->addWidget(new QPushButton("获取验证码"));
    form->addRow("验证码", hlayout1);

    setLayout(form);
}

栈布局(QStackedLayout)

stackedlayoutwidget.h

复制代码
#ifndef STACKEDLAYOUTWIDGET_H
#define STACKEDLAYOUTWIDGET_H

#include <QWidget>
#include <QLabel>
#include <QStackedLayout>

class StackedLayoutWidget : public QWidget
{
    Q_OBJECT
public:
    explicit StackedLayoutWidget(QWidget *parent = nullptr);
protected:
    void timerEvent(QTimerEvent *event) override;
protected:
    // 用于显示数字的Label
    QLabel * label_number;
    // 用于指向StackedLayout布局对象
    QStackedLayout * slayout;
signals:

};

#endif // STACKEDLAYOUTWIDGET_H
stackedlayoutwidget.cpp

#include <QVBoxLayout>
#include <QStackedLayout>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>

#include "boxlayoutwidget.h"
#include "formlayoutwidget.h"
#include "gridlayoutwidget.h"
#include "loginwidget.h"

#include "stackedlayoutwidget.h"

StackedLayoutWidget::StackedLayoutWidget(QWidget *parent) : QWidget(parent)
{
    QVBoxLayout *vlayout1 = new QVBoxLayout(this);
    label_number = new QLabel("显示数字");
    vlayout1->addWidget(label_number);

    // 创建栈布局
    slayout = new QStackedLayout;
//    slayout->addWidget(new QPushButton("第一个按钮"));
//    slayout->addWidget(new QLineEdit("第一个输入框"));
//    slayout->addWidget(new QLabel("第一个Label"));
    slayout->addWidget(new GridLayoutWidget());
    slayout->addWidget(new FormLayoutWidget());
    slayout->addWidget(new BoxLayoutWidget());
    slayout->addWidget(new LoginWidget());
    vlayout1->addLayout(slayout);
    slayout->setCurrentIndex(1);

    startTimer(2000);// 每两秒启动一次定时器
}

void StackedLayoutWidget::timerEvent(QTimerEvent *event) {
    int count = slayout->count(); // 获取栈内有多少个页面
    int curIndex = slayout->currentIndex(); // 获取当前的索引
    curIndex = (curIndex + 1) % count; //计算下一次的索引
    slayout->setCurrentIndex(curIndex);
    qDebug() << "Timeout ...";
}

定时器事件

定时器事件时继承自QObject类特有的事件。他运行继承自Object类的对象重写此事件处理函数来实现自己的功能。

定时器事件函数

复制代码
void QObject::timerEvent(QTimerEvent *event);

定时器启动的方法

复制代码
// 启动定时器,返回定时器的ID,此ID用于停止定时器的操作。
int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
// 根据定时器ID 停止给定的定时器
void QObject::killTimer(int id)
相关推荐
REDcker10 分钟前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
dllmayday19 分钟前
Linux 上用终端连接 WiFi
linux·服务器·windows
ACP广源盛1392462567329 分钟前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Elastic 中国社区官方博客35 分钟前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索
OBiO20131 小时前
Cell | 突破AAV载体容量限制!路中华/姜玉武/刘太安团队开发AAVLINK系统实现大基因递送
笔记
俺不要写代码1 小时前
数据库:函数
数据库·mysql
2401_882273721 小时前
如何在 CSS 中正确加载本地 JPG 背景图片
jvm·数据库·python
曹牧2 小时前
SQL:多个事务同时修改同一索引块
数据库·sql
我命由我123452 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
峥无2 小时前
Linux系统编程基石:静态库·动态库·ELF文件·进程地址空间全景图
linux·运维·服务器