QT基础教程之六布局管理器和常用控件

news2024/9/20 1:24:27

QT基础教程之六布局管理器和常用控件

布局管理器

所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。

Qt 提供了两种组件定位机制:绝对定位和布局定位。

  • 绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。

这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。

  • 布局定位:你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。

布局定位完美的解决了使用绝对定位的缺陷。

Qt 提供的布局中以下三种是我们最常用的:

  • QHBoxLayout:按照水平方向从左到右布局;

  • QVBoxLayout:按照竖直方向从上到下布局;

  • QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;

系统提供的布局控件

img

这4个为系统给我们提供的布局的控件,但是使用起来不是非常的灵活,这里就不详细介绍了。

利用widget做布局

第二种布局方式是利用控件里的widget来做布局,在Containers中

img

在widget中的控件可以进行水平、垂直、栅格布局等操作,比较灵活。

再布局的同时我们需要灵活运用弹簧的特性让我们的布局更加的美观,下面是一个登陆窗口,利用widget可以搭建出如下登陆界面:

img

常用控件

Qt为我们应用程序界面开发提供的一系列的控件,下面我们介绍两种最常用一些控件,所有控件的使用方法我们都可以通过帮助文档获取。

QLabel控件使用

QLabel是我们最常用的控件之一,其功能很强大,我们可以用来显示文本,图片和动画等。

通过QLabel类的setText函数设置显示的内容:

void setText(const QString &)

可以显示普通文本字符串

QLable *label = new QLable;

label->setText(“Hello, World!”);

可以显示HTML格式的字符串

比如显示一个链接:

QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">百度一下</a></h1>");
label ->setOpenExternalLinks(true);

其中setOpenExternalLinks()函数是用来设置用户点击链接之后是否自动打开链接,如果参数指定为true则会自动打开。

显示图片

可以使用QLabel的成员函数setPixmap设置图片

void setPixmap(const QPixmap &)

首先定义QPixmap对象

QPixmap pixmap;

然后加载图片

pixmap.load(":/Image/boat.jpg");

最后将图片设置到QLabel中

QLabel *label = new QLabel;

label.setPixmap(pixmap);

显示动画

可以使用QLabel 的成员函数setMovie加载动画,可以播放gif格式的文件

void setMovie(QMovie * movie)

首先定义QMovied对象,并初始化:

QMovie *movie = new QMovie(":/Mario.gif");

播放加载的动画:

movie->start();

将动画设置到QLabel中:

QLabel *label = new QLabel;

label->setMovie(movie);

QLineEdit

Qt提供的单行文本编辑框。

设置/获取内容

获取编辑框内容使用text(),函数声明如下:

QString text() const

设置编辑框内容

void setText(const QString &)

设置显示模式

使用QLineEdit类的setEchoMode () 函数设置文本的显示模式,函数声明:

void setEchoMode(EchoMode mode)

EchoMode是一个枚举类型,一共定义了四种显示模式:

  • QLineEdit::Normal 模式显示方式,按照输入的内容显示。

  • QLineEdit::NoEcho 不显示任何内容,此模式下无法看到用户的输入。

  • QLineEdit::Password 密码模式,输入的字符会根据平台转换为特殊字符。

  • QLineEdit::PasswordEchoOnEdit 编辑时显示字符否则显示字符作为密码。

另外,我们再使用QLineEdit显示文本的时候,希望在左侧留出一段空白的区域,那么,就可以使用QLineEdit给我们提供的setTextMargins函数:

void setTextMargins(int left, int top, int right, int bottom)

用此函数可以指定显示的文本与输入框上下左右边界的间隔的像素数。

自定义控件

在搭建Qt窗口界面的时候,在一个项目中很多窗口,或者是窗口中的某个模块会被经常性的重复使用。一般遇到这种情况我们都会将这个窗口或者模块拿出来做成一个独立的窗口类,以备以后重复使用。

在使用Qt的ui文件搭建界面的时候,工具栏栏中只为我们提供了标准的窗口控件,如果我们想使用自定义控件怎么办?

例如:我们从QWidget派生出一个类SmallWidget,实现了一个自定窗口,

// smallwidget.h

class SmallWidget : public QWidget

{

  Q_OBJECT

public:

  explicit SmallWidget(QWidget *parent = 0);

 

signals:

 

public slots:

private:

  QSpinBox* spin;

  QSlider* slider;

};

 

// smallwidget.cpp

SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)

{

  spin = new QSpinBox(this);

  slider = new QSlider(Qt::Horizontal, this);

 

  // 创建布局对象

  QHBoxLayout* layout = new QHBoxLayout;

  // 将控件添加到布局中

  layout->addWidget(spin);

  layout->addWidget(slider);

  // 将布局设置到窗口中

  setLayout(layout);

 

  // 添加消息响应

  connect(spin, 

static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),

 slider, &QSlider::setValue);

  connect(slider, &QSlider::valueChanged, 

spin, &QSpinBox::setValue);

}

img

那么这个SmallWidget可以作为独立的窗口显示,也可以作为一个控件来使用:

打开Qt的.ui文件,因为SmallWidget是派生自Qwidget类,所以需要在ui文件中先放入一个QWidget控件, 然后再上边鼠标右键

img

弹出提升窗口部件对话框

img

添加要提升的类的名字,然后选择 添加

img

添加之后,类名会显示到上边的列表框中,然后单击提升按钮,完成操作.

我们可以看到, 这个窗口对应的类从原来的QWidget变成了SmallWidget

img

再次运行程序,这个widget_3中就能显示出我们自定义的窗口了.

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

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

相关文章

C++ deque底层原理

deque底层原理 一、目的二、底层实现三、原理图四、类结构五、push_back六、pop_back 一、目的 实现双端数组 二、底层实现 双向开口的连续线性空间 三、原理图 四、类结构 class deque : protected Deque base _Deque_base._Deque_impl M_map 指针数组 _M_map_size …

java JUC并发编程 第五章 volatile与JMM

系列文章目录 第一章 java JUC并发编程 Future: link 第二章 java JUC并发编程 多线程锁: link 第三章 java JUC并发编程 中断机制: link 第四章 java JUC并发编程 java内存模型JMM: link 第五章 java JUC并发编程 volatile与JMM: link 文章目录 系列文章目录1 volatile 2大特…

KVM虚拟化ubuntu

KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种基于Linux内核的虚拟化技术&#xff0c;它将Linux内核作为虚拟机的底层操作系统&#xff0c;利用硬件虚拟化支持创建和管理虚拟机。KVM虚拟化技术被广泛应用于云计算、虚拟化服务器、虚拟化桌面等场景。 KVM虚拟…

最新无代码排名出炉,哪个平台最适合你?

随着无代码技术的迅速发展&#xff0c;国内外涌现出许多优秀的无代码平台提供商&#xff0c;企业在选择合适的无代码平台时可能会感到困惑&#xff0c;无从下手。为了帮助大家更好地了解国内真正的无代码平台厂商&#xff0c;本文将为您介绍几家具有代表性的厂商。 1.云表平台&…

数组中的第K个最大元素

题目链接 数组中的第K个最大元素 题目描述 注意点 需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素 解答思路 本题可以使用快速排序、堆排序或优先队列解决&#xff0c;快排可以比较快速找到某个元素在数组中排序后的位置&#xff0c;所以找…

Redis——》Redis的部署方式对分布式锁的影响

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

ToBeWritten之针对 Car ATTCK 的攻防矩阵

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

有时间窗车辆路径问题(vehicle routing problems with time windows,VRPTW)学习实践与base案例代码开发

有时间窗车辆路径问题&#xff08;Vehicle Routing Problems with Time Windows&#xff0c;VRPTW&#xff09;是一类著名的组合优化问题&#xff0c;涉及在有限时间窗口约束下&#xff0c;有效地安排多个车辆的路径&#xff0c;以满足客户需求。 在VRPTW中&#xff0c;假设有…

what(): NCCL Error 1: unhandled cuda error解决方法

文章目录 遇到问题解决方法参考 遇到问题 运行项目&#xff1a;ACL2021的一篇工作&#xff0c;LM-BFF (Better Few-shot Fine-tuning of Language Models) https://github.com/princeton-nlp/LM-BFF 遇到环境问题。 我的机器环境如下&#xff1a; 服务器上CUDA版本为11.4 GPU…

为什么要参加浙大MPA提面申请?你看看AB资格的弃考率

时间即将来到九月份&#xff0c;在这个时间点依然能够坚持自己读研梦的考生&#xff0c;可以说基本是今年真正的准考生了&#xff01;在备考坚持这方面&#xff0c;其实每年很多考生走不到最后&#xff0c;比如在9-10月份全国研究生网上报名阶段&#xff0c;接近两成比例的考生…

geant4 常用代码

1 获取特特定能量范围的特定粒子 E:\examples_understanding\geant4-v11.0.0_note\examples\extended\runAndEvent\RE02 //-- Particle with kinetic energy filter.G4SDParticleWithEnergyFilter* pkinEFilter new G4SDParticleWithEnergyFilter(fltName"gammaE filter&…

招生大户!包邮区双非计算机强校计算机考研分析

杭州电子科技大学(B) 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23初试科目、23复试详情、各专业考情分析、各科目考情分析。 正文1689字&#xff0c;多表&#xff0c;预计阅读&#xff1a;5分钟…

Python中小数据池知识最详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一、id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f; id是内存地址&#xff0c;比如你利用i…

centos升级python

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

JavaScript常见的运算符

一、运算符和运算元 1.认识运算符 在小学的时候我们就学习了各种运算符&#xff0c;比如加号 、乘号 *、减号 - 、除号/ 几乎所有的编程语言都有各种各样的运算符(也被称之为操作符&#xff0c;operators) 初次接触这些运算符, 你会感觉种类繁多, 难以记忆.但是并不需要特别…

Lora升级!ReLoRa!最新论文 High-Rank Training Through Low-Rank Updates

目录 摘要1 引言2 相关工作3 方法4 实验5 结果6 结论7 局限性和未来工作 关注公众号TechLead&#xff0c;分享AI与云服务技术的全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0…

使用文本编辑器sublime text编写python代码

前言 上篇文章介绍了如何安装python程序&#xff0c;这次就讲讲如何用sublime来编写python代码 有的小伙伴可能会有疑问&#xff0c;为什么不选择pycharm来编写&#xff1f; pycharm写代码会有代码补全功能&#xff0c;而我们新手正是要在犯错误的过程中积累经验&#xff0c…

论文解读 | 新发现编码器PointPillars用于点云检测物体,更加高效且精准

原创 | 文 BFT机器人 01 技术背景 在过去的几年中&#xff0c;深度学习技术已经在图像领域的物体检测中取得了显著的进展&#xff0c;诸如目标检测算法&#xff08;如Faster R-CNN、YOLO和SSD&#xff09;在图像中能够高效准确地检测出物体。然而&#xff0c;当涉及到点云数据…

get√接口自动化核心知识点浓缩,为面试加分

日常接触到的接口自动化从实际目标可以划分为两大类&#xff1a; 1、为模拟测试数据而开展的接口自动化 这种接口自动化大多是单次执行&#xff0c;目的很明确是为了功能测试创造测试数据&#xff0c;节约人工造数据的时间和人工成本&#xff0c;提高功能测试人员的测试效率。…

《论文阅读18》JoKDNet

一、论文 研究领域&#xff1a;用于大尺度室外TLS点云配准的联合关键点检测和特征表达网络论文&#xff1a;JoKDNet: A joint keypoint detection and description network for large-scale outdoor TLS point clouds registration International Journal of Applied Earth Ob…