QT基本组件与常用类

news2024/12/28 4:53:09

目录

一、设计师 Designer(掌握)

二、布局 Layout

2.1 布局的基本使用(掌握)

2.2 布局属性(掌握)

2.3 伸展器(掌握)

2.4 嵌套(掌握)

2.5 伸展与策略(了解)

2.6 代码布局(了解)

三、Designer连接信号槽(了解)

四、ui指针(掌握)

五、基本组件(掌握)

5.1 QWidget常用属性

5.2 标签 QLabel

5.3 按钮类

5.3.1 按钮类基本使用

5.3.2 按钮组 QButtonGroup

5.4 单行文本输入框 QQLineEdit

5.5 一组类似的组件

5.6 组合框 QComboBox

目录

一、设计师 Designer(掌握)

二、布局 Layout

2.1 布局的基本使用(掌握)

2.2 布局属性(掌握)

2.3 伸展器(掌握)

2.4 嵌套(掌握)

2.5 伸展与策略(了解)

2.6 代码布局(了解)

三、Designer连接信号槽(了解)

四、ui指针(掌握)

五、基本组件(掌握)

5.1 QWidget常用属性

5.2 标签 QLabel

5.3 按钮类

5.3.1 按钮类基本使用

5.3.2 按钮组 QButtonGroup

5.4 单行文本输入框 QQLineEdit

5.5 一组类似的组件

5.6 组合框 QComboBox

一、QString类(掌握)

二、容器类(掌握)

2.1 QList

2.2 QMap

三、Qt数据类型(熟悉)

3.1 Qt统一数据类型

3.2 Qt的通用数据类型QVariant

四、时间与日期(熟悉)

4.1 时间戳

4.2 格式化

4.3 相关UI组件

五、定时器 QTimer(掌握)


一、设计师 Designer(掌握)

Designer是一款用于设计Qt界面的程序,它生成的文件是.ui界面文件。

Designer程序可以独立启动,但是通常我们使用的是Qt Creator中内置的Designer程序,要使用内置的Designer程序,需要创建的Qt项目中包含.ui文件,因此创建一个带界面文件的Qt项目来使用Designer程序。

在Qt Creator中双击打开.ui文件,即可启动内置的Designer程序。

Designer程序的各个面板介绍如下:

二、布局 Layout

2.1 布局的基本使用(掌握)

可以把布局想象成一个“透明的盒子”,若干组件对象放置到“透明盒子”中,这些组件会按照“盒子”预设的规则自动排布。

本次讲解三种布局

  • 垂直布局 Vertical Layout

真正的类名叫QVBoxLayout

  • 水平布局 Horizontal Layout

真正的类名叫QHBoxLayout,与垂直布局相比,只有方向不同。

  • 格点布局 Grid Layout

真正的类名叫QGridLayout

2.2 布局属性(掌握)

垂直布局与水平布局属性相同:

2.3 伸展器(掌握)

当布局需要填充空间的时候需要一个辅助的组件:

伸展器,分为横向和竖向的。

2.4 嵌套(掌握)

布局可以嵌套,内层布局相当于外层布局的一个组件。

2.5 伸展与策略(了解)

QPushButton在垂直布局和水平布局中按照伸展比例设置时,表现出现象不同,原因是QPushButton组件中有一个sizePolicy属性控制的。

Minimum表示当缩小为最小时,不会继续缩小,但是可以放大。

Fixed表示大小不变。

除此之外,还有一些可选项,例如Maximum表示当放大到最大时,不再继续变大,但是可以缩小、Prefered(近似Expanding)缩小放大不受限制。

建议不要随意修改组件默认的策略,也就是说此属性适用于所有QWidget的派生类。

2.6 代码布局(了解)

除了上面使用Designer进行布局外,也可以通过C++代码进行布局。

需要新建一个不带ui界面文件的Qt项目。

dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
// 头文件
#include <QVBoxLayout>
#include <QPushButton>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    QVBoxLayout* layout; // 布局对象
    QPushButton* btn1;
    QPushButton* btn2;
};

#endif // DIALOG_H

dialog.cpp

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    resize(300,300);
    btn1 = new QPushButton("按钮1",this);
    btn2 = new QPushButton("按钮2",this);
    // 创建布局对象
    layout = new QVBoxLayout(this);
    // 添加组件到布局中
    layout->addWidget(btn1);
    layout->addWidget(btn2);
}

Dialog::~Dialog()
{
    delete layout;
    delete btn1;
    delete btn2;
}

从此往后,创建项目,再也不取消创建界面选项了,即后续的学习都使用ui界面文件。

三、Designer连接信号槽(了解)

Designer也可以连接信号槽,但是仅限于自带的信号,槽函数可以自动生成,也可以使用自带的。

在Designer中,点击键盘F4按钮,即可进入信号槽编辑状态。在编辑状态中,可以拖拽组件对象形成不同的信号槽连接,只需要在弹出的窗口中选择对应的函数即可。

配置好信号槽连接后,可以点击F3退出此模式。在普通模式下,也可以配置信号槽的连接,需要切换到“信号与槽编辑器”,如下所示。

在此面板中,所有的信号槽连接都以表格的方式进行展示,点击单元格也能配置。

除此之外,Designer也可以配置自带信号与自定义槽函数的连接,只需要选中组件对象后,点击鼠标右键的“转到槽”。

在弹出窗口中,可以选择当前组件适用的信号,如下所示。

选择信号函数后,Designer会自动在C++代码中生成对应的槽函数。程序员只需要在这个自动生成的槽函数中添加要执行的代码即可,无需适用connect连接,因为信号与槽函数已经连接好了。

在实际开发过程中,不建议使用Designer设计信号槽,仍然建议完全在C++代码中手动编写信号槽的相关代码,原因是使用Designer的方式会导致信号与槽的对应关系不明确,降低代码的可读性和可维护性。

四、ui指针(掌握)

实际上Designer程序的原理是,通过用户对图形化设计界面的拖拽和属性参数设置,自动生成.ui文件中的代码,而.ui文件中的代码是xml标签。

ui文件中的xml代码会在项目编译的过程,转换为C++代码,也就是说在Designer中设计的每个组件都会以C++对象的形式在这个步骤中创建。

通过ui指针可以获取和管理在Designer中设计的组件对象,包括对象的销毁,即ui指针销毁后,其管理的所有组件对象也一并销毁。

五、基本组件(掌握)

5.1 QWidget常用属性

在讲解各种不同的基本组件使用之前,先讲解一些常用的QWidget类的属性。

5.2 标签 QLabel

用来显示文字或图片,QLabel独有属性如下:

图片下载建议使用必应搜索:必应

图片导入项目的步骤如下:

1. 下载图片(jpg或png)后,命名为全小写英文,英文之间可以使用下划线分割。

2. 把图片放置到工作目录下。

3. 在Qt Creator中,选中项目,鼠标右键,点击“添加新文件”。

4. 在弹出的窗口中,按照下图所示进行操作。

5. 在弹出的窗口中,填写资源文件的民称后,点击“下一步”。

6. 在项目管理页面,直接点击“完成”。可以看到项目目录下多了一个.qrc格式的资源文件。

7. 选中.qrc资源文件,点击下方的

,在弹出的下拉菜单中,点击添加前缀,这一步只需要第一次操作即可。

8. 再次点击

,此时可以在弹出的下拉菜单中点击添加文件,点击“添加文件”后,弹出文件选择对话框,选择要添加的图片文件即可。

9. 可以在.qrc文件中看到刚刚添加的图片文件,后面就可以在项目中使用这张图片了。

设置图片到QLabel组件的方式如下:

  • 法一 通过Designer设置

先编译运行一遍程序(如果不这么做,Designer识别不了刚添加到资源文件中的图片),然后在Designer中选中QLabel组件,设置属性pixmap的值为显示的图片。需要注意的是,给pixmap属性设置图片时,要点击“选择资源”,而不是“选择文件”。

这种设置方式进行图像处理比较麻烦,最好在ps中处理好图片资源。

  • 法二

通过C++代码进行图片缩放,相比之下处理能力更好一些。

需要注意的是,尽量不要使用过大的图片,因为会增加程序的性能开销。

5.3 按钮类

5.3.1 按钮类基本使用

按钮类组件有QPushButton、QCheckBox、QRadioButton、QToolButton,分别表示按压式按钮、单选框、多选框和工具栏按钮。它们都有一个公共的基类:QAbstractButton,这个类规定了很多按钮的基本功能框架。

QAbstractButton常用属性有:

图标下载网站-阿里巴巴矢量图标库:iconfont-阿里巴巴矢量图标库

QAbstractButton常用信号如下:

5.3.2 按钮组 QButtonGroup

有的界面按钮很多,逐个按钮建立信号槽未免显得有些太过复杂。解决方法就是使用QButtonGroup按钮组。

QButtonGroup类仅仅是逻辑上的分组,并没有任何UI效果,也不属于UI组件,因此不归ui指针管理,需要程序员手动创建与销毁。

构造函数:

QButtonGroup(QObject * parent = 0)

只要parent参数不是QWidget类型的,说明此类不是UI相关类型,不归ui指针管理。

成员函数:

void addButton(QAbstractButton * button, int id = -1)

向按钮组中添加按钮对象

参数1:按钮对象

参数2:给按钮一个id号,要求正数且唯一

需要注意的是,多选按钮加到按钮组后会自动互斥,需调用下面的函数解除互斥。

group->setExclusive(false);

信号函数:

5.4 单行文本输入框 QQLineEdit

用于输入单行文本信息。

常用属性:

常用信号:

void textChanged(const QString & text)

每次文字发生变化时发射此信号,参数是新的文字

5.5 一组类似的组件

这一组组件的功能类似,包括:QSpinBox、ProgressBar、QSlider、QScrollBar、QDial,它们的继承结构如下所示:

各个组件的外观如下所示:

上面的组件有几个共同的属性:

  • maximum : int

最大值

  • minimum : int

最小值

  • value : int

当前值,通知信号:

void valueChanged(int value)

5.6 组合框 QComboBox

组合框用来代替QRadioButton等组件,可以点击之后弹出多个选项(英文:Item,中文译名为“项目”)。

常用属性:

常用信号:

一、QString类(掌握)

QString类是Qt的字符串类,采用Unicode编码,每个字符是一个16位的QChar,而不是8位的char,因此Qt可以完美地处理中文,并且一个中文字符算作一个字符长度。

由于在Unicode编码诞生之前,各国为自己的语言设计了本地的编码(如中文的GBK编码),在传输和转码过程中可能还会出现乱码问题,如果在Qt开发的过程中出现乱码问题,可以参考:从此乱码是路人

QString的函数相当多,不要去死记函数的固定使用,要求做到:

  • 记住函数中每个单词的意思
  • 用到的时候查文档

需要注意的是,QString类基本做到了兼容std::string的API

需要记住的函数词汇有:

append 向后追加

at 取出元素

begin 获取开始位置的迭代器

clear 清空

compare 比较

contains 包含

count 数量

endsWith 以...结尾

fill 每个元素填充

indexOf 出现的位置序号

insert 插入

isEmpty/isNull 是否为空,注意二者有差别

lastIndexOf 最后一次出现的位置下标

length 长度

prepend 向前追加

push_back 向后追加

push_front 向前追加

remove 移除

replace 替换

size 大小

split 分割

startsWith 以...开始

swap 交换

trimmed 去除空格

truncate 截取

类型转换示例代码:

    int i = 124;
    // 静态函数转换:数字→字符串
    QString s1 = QString::number(i);
    qDebug() << s1;

    // 成员函数转换:数字→字符串
    QString s2;
    s2.setNum(i);
    qDebug() << s2;

    // 字符串→数字
    QString str = "FF";
    bool ok;
    // 参数1:转换结果
    // 参数2:进制
    int hex = str.toInt(&ok,16);
    qDebug() << "转换后的数字是:" << hex; // 255
    qDebug() << "转换的结果是:" << ok; // true

【课堂练习】写一个函数输入一个字符串,返回值是bool,如果这个字符串符合电子邮件的地址则返回true,不符合返回false。

判断依据是:

  • 要有@
  • 要以.com结尾
  • 忽略大小写
  • @与.com之间有内容,且内容是数字或英文字母
  • @前面有英文或数字内容

二、容器类(掌握)

Qt的容器类相比C++的容器类更加轻巧、安全和易于使用,因为Qt对其进行速度和存储优化,可以减少可执行文件的大小;它们是线程安全的;在兼容C++容器类API接口的基础上,拓展了API接口。

本次学习顺序容器使用QList进行讲解,关联容器使用QMap进行讲解。

2.1 QList

QList是最常用的一种顺序容器,以增删改取遍历进行讲解演示。

到现在为止,Qt的课程中没有创建过任何一个用户自定义的类,下面手动创建一个基于C++的Student学生类,进行简单的封装后,把不同的学生对象存储到QList中。

创建自定义C++类的步骤如下:

1. 在Qt Creator中选中项目名称,鼠标右键,点击“添加新文件”。

2. 在弹出的窗口中,按照下图所示进行操作。

3. 在弹出的窗口,先输入新创建的C++类名,然后点击“下一步”。

4. 在项目管理页面,直接点击“完成”。可以看到项目中增加了对应头文件和源文件。

需要注意的是,QStringList类可以基本等同于QList<QString>

2.2 QMap

用法与C++中的map类似。

三、Qt数据类型(熟悉)

3.1 Qt统一数据类型

Qt是一个跨平台的开发框架,但是Qt依赖的C++语言并不是跨平台的,特别是很多基础的数据类型在不同的平台上可能会存在长度不一致的现象,所以当涉及跨平台需求时,Qt设计了一些可以保持统一长度的数据类型。

3.2 Qt的通用数据类型QVariant

QVariant类支持几乎所有的Qt常见的基本数据类型的转换。

    // 数字 → 字符串
    int a = 1;
    QVariant v(a);
    QString s = v.toString();
    qDebug() << s;

    // 字符串 → 数字
    QVariant v2(s);
    int b = v2.toInt();
    qDebug() << b;

四、时间与日期(熟悉)

Qt中使用QTime类来处理时间,使用QDate类来处理日期,这两个类合并为QDateTime,可以同时处理时间和日期。

以QDateTime类来说明时间和日期的处理方法。

4.1 时间戳

qint64 QDateTime::currentMSecsSinceEpoch() [static]

返回当前时间,格式为从1970-1-1 00:00:00 格林威治时间到现在的毫秒数。

可以利用上面的时间来作为生成随机数的种子。

    // 参数是随机数种子
    qsrand(QDateTime::currentMSecsSinceEpoch());
    // 产生一个0-9的随机数
    int rand = qrand()%10;
    qDebug() << "伪随机数:" << rand;

4.2 格式化

可以使用QDateTime对日期和时间进行格式化,函数如下:

QString QDateTime::toString(const QString & format) const

参数是一个字符串,为具体格式:

可以使用下面的函数来获取基于当前时区的当前时间和日期的QDateTime对象,当前指的是来自于系统数据。

QDateTime QDateTime::currentDateTime() [static]

    // 先获得一个基于当前的QDateTime对象
    QDateTime dt = QDateTime::currentDateTime();
    // 格式化
    QString text = dt.toString("yyyy-MM-dd hh:mm:ss");
    qDebug() << text;

4.3 相关UI组件

主要有QDateEdit、QDateTimeEdit、QTimeEdit和QCalendarWidget。

五、定时器 QTimer(掌握)

QTimer类与硬件定时器功能类似,主要完成两个功能:

  • 倒计时触发
  • 周期触发

常用属性:

主要通过singleShot的setter设定定时器是否为一次性,通过interva的setter设置定时器触发时间,然后调用启动函数:

void QTimer::start() [slot]

需要注意的是,如果定时器已经在运行了,再次调用start函数会停止定时器并重新运行。

如果定时器已经运行,也可以调用下面的函数停止定时器的运行:

void QTimer::stop() [slot]

当定时器触发时会发射以下信号:

void QTimer::timeout() [signal]

此类的对象需要手动创建:

QTimer::QTimer(QObject * parent = 0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言进阶】想用好C++?那就一定要掌握动态内存管理

目录 &#x1f929;前言&#x1f929;&#xff1a; 一、动态内存概述⚔️&#xff1a; 1.什么是动态内存&#xff1a; 2.动态内存分配的意义&#xff1a; 二、常用的动态内存函数&#x1f3f9;&#xff1a; 1. malloc 和 free函数&#xff1a; ①. malloc 函数&#xff1a; …

基于PSO粒子群优化的带时间窗VRPTW问题matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation)&#xff0c;1995 年由Eberhart 博士和kennedy 博士提出&#xff0c;源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活…

数据结构初阶:树与二叉树(1)——堆

许久没发博客&#xff0c;在这里跟各位看客道声久等了~ 冬至已至&#xff0c;各位有没有吃上热乎的饺子呢 下面给各位奉上承载着满满干货的饺子吧&#xff1a; 目录 一、树 1. 树的结构定义 2. 树的相关概念 3. 树的表示 孩子兄弟表示法 二、二叉树 1. 二叉树的结构定义 2. 特…

自己整理的vue实现生成分享海报(含二维码),看着网上的没实现

大家好&#xff0c;我是雄雄。 前言 相信大家在许多的场景下&#xff0c;看到过这样的案例。 当我们在某购物app上看好一件商品&#xff0c;想分享给别人时&#xff0c;app会给我们生成一张海报&#xff0c;我们将其保存在手机里面转发给其他人达到分享。当我们逛CSDN的时候&…

【Android弹窗】Dialog Bottom Translate Animation

文章目录1. 系统Dialog2. 自定义Dialog3. 其余1. 系统Dialog 首先先来使用回顾一下系统的Dialog弹窗&#xff0c;这里使用比较简单的AlertDialog为例&#xff1a; AlertDialog.Builder builder new AlertDialog.Builder(this).setTitle("弹窗标题").setMessage(&q…

【小程序】全局数据共享

目录 全局数据共享 1. 什么是全局数据共享 2. 小程序中的全局数据共享方案 全局数据共享 - MobX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 ​5. 将 Store 中的成员绑定到组件中 6. 在组件中…

【分布式技术专题】「架构实践于案例分析」盘点一下分布式模式下的服务治理和监控优化方案

什么是服务治理&#xff1f; 相信每一个软件公司&#xff08;企业&#xff09;都希望可以确保开发及项目运行流程可以顺利&#xff0c;但是如果要完美完结那么需要其中会有很多的因素存在。包括&#xff0c;最佳实践、架构原则、服务治理以及其他决定性的因素。而其中服务治理…

新冠确诊阳性的第七篇博客,Linux动态监控系统

新冠确诊阳性的第七篇博客&#xff0c;Linux动态监控系统1.动态监控进程2.动态监控网络1.动态监控进程 top命令和ps相似&#xff0c;都可以用来显示系统正在执行的进程&#xff0c;top和ps的最大不同之处就是在于top在执行一段时间可以更新正在运行的进程&#xff08;也可以理…

JavaScript:优先级队列的实现案例

优先级队列的定义&#xff1a;优先级队列&#xff08;priority_queue&#xff09;其实&#xff0c;不满足先进先出的条件&#xff0c;更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素&#xff0c;而不是队首的元素。这个优先级可以通过元素的…

架构设计(九):估算

架构设计&#xff08;九&#xff09;&#xff1a;估算 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;架构设计&#xff08;九&#xff09;&#xff1a;估算 CSDN&#xff1a;架构设计&#xff08;九&#xff09;&#xff1a;估算 估算在系统设计中非常重…

还在用定时器吗?借助 CSS 来监听事件

平时工作中很多场合都要用到定时器,比如延迟加载、定时查询等等,但定时器的控制有时候会有些许麻烦,比如鼠标移入停止、移出再重新开始。这次介绍几个借助 CSS 来更好的控制定时器的方法,一起了解一下吧,相信可以带来不一样的体验 一、hover 延时触发 有这样一个场景,在…

C++ WebSockSet服务器解决方案

使用C实现WebSocket服务器是为了解决Web直接访问本地应用程序最佳解决方案。解决云访问硬件最经济的方案或增加了一种解决方法。方案选用开源uWebSockets库。 开发工具选择Visual C 2017,所有源码或工程都用它编译或创建。 1. 准备工作 下载以下第三方库最新版源码并且编译供…

FMOC-PEG-COOH,FMOC-PEG-acid,芴甲氧羰基-聚乙二醇-羧基试剂供应

英文名称&#xff1a;FMOC-PEG-COOH&#xff0c;FMOC-PEG-acid 中文名称&#xff1a;芴甲氧羰基-聚乙二醇-羧基 蛋白质、肽和其他材料通过氨基酸或其他酸活性化学组&#xff0c;增加溶解度和稳定性&#xff0c;降低免疫原性&#xff1b;药物修饰或缓释药物研发&#xff0c;新…

复旦MBA第二学位:畅享顶尖国际商科资源,探索全球发展新可能

自2009年以来&#xff0c;复旦MBA项目一直致力于与顶级院校开展合作&#xff0c;拓宽学生的国际视野。目前&#xff0c;复旦MBA项目与三所国际顶尖合作院校达成了第二学位项目的合作&#xff1a;美国麻省理工学院斯隆管理学院管理学硕士学位(Master of Science in Management S…

【OpenCV-Python】教程:7-7 PCA

OpenCV Python PCA 【目标】 利用 pca 来计算目标的方向 【理论】 Introduction to Principal Component Analysis (PCA) PCA&#xff08;主成分分析&#xff09;是提取最重要特征的统计过程。 假设你有一组2D点&#xff0c;如上图所示。每个维度都对应于您感兴趣的特性。…

Blender——苹果的材质绘制

效果图 前言 在进行纹材质的绘制之前&#xff0c;首先要具有苹果的三维模型和进行苹果纹理绘制。 关于苹果的建模请参考&#xff1a;Blender——“苹果”建模_行秋的博客 关于苹果的纹理绘制请参考&#xff1a;Blender——苹果纹理绘制_行秋的博客 书接上回&#xff0c;由Te…

FMOC-PEG-acid,FMOC-PEG-COOH,芴甲氧羰基PEG羧基用于探究新型材料

用于探究新型材料的化学试剂芴甲氧羰基-聚乙二醇-羧基&#xff0c; 其英文名为FMOC-PEG-acid&#xff08;FMOC-PEG-COOH&#xff09;&#xff0c;它所属分类为Boc/Fmoc protected amine PEG Carboxylic acid PEG。 芴甲氧羰基peg羧基试剂的分子量均可定制&#xff0c;有&#…

使用nginx实现自定义大小预览缩略图,http_image_filter模块的安装使用

使用nginx实现自定义大小预览缩略图&#xff0c;http_image_filter模块的安装使用注意事项服务器配置方法安装模块备份http_image_filter模块用以调用配置文件调整引入模块修改配置文件设置访问入口随后重启nginx服务访问请求测试注意事项 本预览图功能使用的是nginx的http_im…

哦,原来事务传播是这样

引言 ​ 在介绍正文之前&#xff0c;让我们先一起来看下这段代码&#xff1a; Transactionalpublic void createProduct(Long skuId, Integer number, Long operatorUcid) {// 插入商品信息recordProduct(skuId, number);// 插入商品操作记录日志recordProductOperateLogClass…

关于操作数组元素的实际应用

sort()升序、降序排序方法应用 sort()排序方式原理&#xff1a;当sort()传入函数中的第一个参数a位于第二个参数b之前&#xff0c;则返回一个负数&#xff0c;相等则返回0&#xff0c;a位于b之后则返回正数。 比如&#xff0c;当要做升序排序时&#xff0c;我们需要想到前面的…