当前位置: 首页 > news >正文

《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:// 用于显示数字的LabelQLabel * 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)
http://www.dtcms.com/a/477623.html

相关文章:

  • 保定网站建设与seo贵州快速整站优化
  • SOLIDWORKS转换为3DXML全流程技术指南:附迪威模型网在线方案
  • 【Java Xml】Apache Commons Digester3解析
  • 一文读懂微软 MOS 国际认证
  • 微软Defender for Endpoint漏洞3个月未修复,攻击者可绕过认证并上传恶意文件
  • 柱状图的高级玩法:分组、堆叠、百分比对比
  • 湖南金科建设有限公司网站那些网站是做俄罗斯鞋子
  • 详解Jenkins 的 Declarative Pipeline中post 语法
  • 淘宝客怎么在网站做推广上海新闻坊
  • 无人机中继器模式技术对比
  • HTTP与HTTPS:从明文到加密的Web安全革命
  • LINUX1013 shell:sed ./sed.sh 1.txt sed -f sed.sh 1.txt awk
  • 无人机技术解析:遥传、数传与图传的核心作用
  • 反无人机和反无人机系统(C-UAS)技术
  • 基于ARM+FPGA的无人机数据采集卡,6通道24bit采集
  • 扬州哪里做网站玉树营销网站建设公司
  • 【Linux指南】Linux命令行进度条实现原理解析
  • 如何基于ElasticsearchRetriever构建RAG系统
  • 网站建设内容与实现功能免费信息发布网有哪些
  • 【Java】nacos的作用(事例)以及其如何发挥功能的?
  • 杨辉三角的变形
  • 试从源码角度分析Handler的post和sendMessage方法的区别和应用场景?
  • 网站流量如何突破厦门建设局局长李德才
  • 外包网站设计网站建设的主要技术路线
  • iOS 26 电耗监测与优化,耗电问题实战 + 多工具 辅助策略
  • 企业前端网站模板下载 HTML前端模板网站
  • 【RabbitMQ】 RabbitMQ Overview
  • uniapp+vue3+vite+ts+xr-frame实现ar+vr渲染踩坑记
  • 如何选择适合的加密方法来保护云计算中的数据
  • Linux 云计算核心技术:原理、组件与 K8s 实战部署