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

【Qt开发】常用控件(一)

目录

1 -> 控件概述

2 -> Qt 控件体系的发展

2.1 -> 阶段一:经典 Widgets 时代 (Qt 1.x - Qt 4.x)

2.2 -> 阶段二:Graphics View 框架 (Qt 4.2+)

2.3 -> 阶段三:Qt Quick 革命 (Qt 4.7+)

2.4 -> 阶段四:统一框架时代 (Qt 5.x - Qt 6.x)

3 -> QWidget 核心属性

3.1 -> 核心属性概览


1 -> 控件概述

Widget 是 Qt 中的核心概念,控件是构成一个图形化界面的基本要素。

其中,按钮、列表视图、树形视图、单行输入框、多行输入框、滚动条、下拉框等都可以称为控件

Qt 作为一个成熟的 GUI 开发框架,内置了大量的常用控件。这点在 Qt Designer 中就可以看到端倪。并且 Qt 也提供了 “自定义控件” 的能力,可以让开发者在现有控件不能满足需求的时候,对现有控件做出扩展,或者手搓一个新的控件。

手搓控件:

所以,熟悉并掌握 Qt 内置的常用控件是非常重要的。这些控件对于我们开发者快速开发出符合需求的界面,是至关重要的。

2 -> Qt 控件体系的发展

Qt 的控件体系经历了从传统桌面部件到现代跨平台UI框架的革命性转变,整个过程可分为四个关键阶段:

2.1 -> 阶段一:经典 Widgets 时代 (Qt 1.x - Qt 4.x)

核心架构QWidget 基类 + 继承体系
代表控件

技术特点

  • 像素级控制:基于 CPU 渲染的软件绘制

  • 平台抽象层:通过 QStyle 实现原生外观

  • 手动布局QLayout 管理器(QVBoxLayout/QHBoxLayout)

  • 信号槽机制:独特的对象通信系统

  • MVC 支持QItemDelegate + QAbstractItemModel

典型代码

// Qt4 风格窗口创建
QWidget *window = new QWidget;
QPushButton *button = new QPushButton("Click", window);
QVBoxLayout *layout = new QVBoxLayout(window);
layout->addWidget(button);
connect(button, SIGNAL(clicked()), this, SLOT(onClicked()));

局限性

  • 性能瓶颈(复杂UI卡顿)

  • 动画支持薄弱

  • 难以实现现代视觉效果

  • 跨平台样式不一致

2.2 -> 阶段二:Graphics View 框架 (Qt 4.2+)

技术突破

关键创新

  • 基于场景图的渲染架构

  • 支持变换/旋转/缩放等操作

  • 内置动画框架(QPropertyAnimation

  • 百万级项的高效渲染

应用场景

  • 数据可视化

  • CAD/CAM 软件

  • 复杂动画界面

  • 电子地图系统

典型实现

QGraphicsScene scene;
QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);
rect->setFlag(QGraphicsItem::ItemIsMovable);QGraphicsView view(&scene);
view.show();

2.3 -> 阶段三:Qt Quick 革命 (Qt 4.7+)

技术栈

QML(声明式UI) + JavaScript(逻辑) + Qt C++(后端)

架构演进

核心优势

  • 60 FPS 流畅动画:GPU 加速渲染

  • 响应式设计:状态机和绑定表达式

  • 跨平台一致性:统一视觉风格

  • 热重载开发qmlscene 即时预览

QML 示例

// 现代按钮组件
Button {text: "Dynamic Button"background: Rectangle {gradient: Gradient {GradientStop { position: 0; color: "#3498db" }GradientStop { position: 1; color: "#2980b9" }}}onClicked: {rotationAnimation.start()}RotationAnimation {id: rotationAnimationtarget: parentto: 360; duration: 1000}
}

2.4 -> 阶段四:统一框架时代 (Qt 5.x - Qt 6.x)

技术融合

Widgets + Quick = 混合应用架构

关键进展

技术方向Qt5 实现Qt6 增强
渲染引擎基于 OpenGL 的 Scene GraphVulkan/Metal/D3D12多后端
QML 性能QML 编译器强类型系统 + AOT 编译
平台支持Android/iOS 基础支持原生平台集成深度优化
3D 集成Qt 3D 模块与 Qt Quick 3D 深度整合

混合架构示例

// 在Widgets中嵌入QML
QQuickWidget *quickWidget = new QQuickWidget;
quickWidget->setSource(QUrl("qrc:/ModernUI.qml"));
mainLayout->addWidget(quickWidget);// 在QML中使用传统控件
QmlApplicationEngine engine;
engine.rootContext()->setContextProperty("tableModel", &dataModel);
engine.load("qrc:/HybridView.qml");
// HybridView.qml
Item {TableView {  // Qt Quick控件model: tableModel//...}QtWidgets.QCalendar {  // 传统Widget组件anchors.bottom: parent.bottom}
}

3 -> QWidget 核心属性

在 Qt 中,使用 QWidget 类表示 “控件”。像按钮、视图、输入框、滚动条等具体的控件类,都是继承自 QWidget。

可以说,QWidget 中就包含了 Qt 整个控件体系中,通用的部分

在 Qt Designer 中,随便拖一个控件,选中该控件,即可在右下方看到 QWidget 中的属性。

这些属性既可以通过 Qt Designer 直接修改,也可以通过代码的方式进行修改。

这些属性的具体含义,在 Qt Assistant 中均有详细的介绍(在 Qt Assistant 中搜索 QWidget,即可找到对应的文档说明,或者在 Qt Creator 代码中,选中 QWidget,并按 F1)。

3.1 -> 核心属性概览

下列表格列出了 QWidget 中的属性及其作用。

属性说明
enabled
设置控件是否可使⽤。 true 表⽰可⽤, false 表⽰禁⽤
geometry位置和尺寸。包含 x,y,width,height 四个部分。其中坐标是以父元素为参考进行设置的
windowTitle设置 widget 标题
windowIcon设置 widget 图标
windowOpacity设置 widget 透明度
cursor

鼠标悬停时显示的图标形状。

是普通箭头,还是沙漏,还是十字等形状。

在 Qt Designer 界面中可以清楚看到可选项

font

字体相关属性

涉及到字体家族、字体大小、粗体、斜体、下划线等样式

toolTip鼠标悬停在 widget 上会在状态栏中显示的提示信息
toolTipDuringtoolTip 显示的持续时间
statusTipWidget 状态发生改变时显示的提示信息(比如按钮被按下等)
whatsThis鼠标悬停并按下 alt + F1 时,显示的帮助信息(显示在一个弹出的窗口中)
styleSheet

允许使用 CSS 来设置 widget 中的样式

Qt 中支持的样式非常丰富,对于前端开发人员来说是很好上手的

focusPolicy

该 widget 如何获取到焦点

  • Qt::NoFocus:控件不参与焦点管理,即无法通过键盘或鼠标获取焦点
  • Qt::TabFocus:控件可通过 Tab 键获得焦点
  • Qt::ClickFocus:控件可通过鼠标点击获得焦点
  • Qt::StrongFocus:控件可通过键盘和鼠标获得焦点
  • Qt::WheelFocus:控件可通过鼠标滚轮获得焦点(在某些平台或样式中不可用)
contextMenuPolicy

上下文菜单的显示策略

  • Qt::NoContextMenu:禁用上下文菜单,即使用户点击鼠标右键也不会显示菜单
  • Qt::DefaultContextMenu:默认的上下文菜单策略,用户可以通过鼠标右键或键盘快捷键触发上下文菜单
  • Qt::PreventContextMenu:将上下文菜单替换为控件的 “动作” 菜单,用户可以通过鼠标右键或键盘快捷键触发这个菜单
  • Qt::CustomContextMenu:使用自定义的上下文菜单,用户可以通过鼠标右键或键盘快捷键触发这个菜单
locale设置语言和国家地区
acceptDrops

该部件是否接受拖放操作

如果设置为true,那么该部件就可以接收来自其他部件的拖放操作。当一个部件被拖放到该部件上时,该部件会接收到相应的拖放事件(如 dropEvent)

如果设置为false,那么该部件将不会接收任何拖放操作

minimumSize控件的最小尺寸。包含最小宽度和最小高度
maximumSize控件的最大尺寸。包含最大宽度和最大高度
sizePolicy尺寸策略。设置控件在布局管理器中的缩放方式
windowModality指定窗口是否具有 “模态” 行为
sizeIncrement拖动窗口大小时的增量单位
baseSize窗口的基础大小,用来搭配 sizeIncrement 调整组件尺寸,计算组件应该调整到的合适的值
palette调色板。可以设置 widget 的颜色风格
mouseTracking

是否要跟踪鼠标移动事件

如果设为 true,表示需要跟踪,则鼠标划过的时候该 widget 就能持续收到鼠标移动事件

如果设为 false,表示不需要跟踪,则鼠标划过的时候 widget 不会收到鼠标移动事件,只能收到鼠标按下或者释放的事件

tabletTracking

是否跟踪触摸屏的移动事件。

类似于 mouseTracking。Qt 5.9 中引入的新属性

layoutDirection

布局方向。

  • Qt::LeftToRight:文本从左到右排列,也是默认值
  • Qt::RightToLeft:文本从右到左排列
  • Qt::GlobalAtomics:部件的布局方向由全局原子性决定(其实就是根据应用程序中的其他 widget 布局方向确定的)
autoFillBackground是否自动填充背景颜色
windowFilePath能够把 widget 和一个本地文件路径关联起来
accessibleName设置 widget 的可访问名称。这个名称可以被辅助技术(如屏幕阅读器)获取到。这个属性用于实现无障碍程序的场景中(就是给盲人写的程序)
accessibleDescription设置 widget 的详细描述。作用同 accessibleName
inputMethodHints针对输入框有效,用来提示用户当前能输入的合法数据的格式。比如只能输入数字,只能输入日期等

后续的文章会介绍常用属性,希望大家多多支持!!!


感谢各位大佬支持!!!

互三啦!!!

http://www.lryc.cn/news/610823.html

相关文章:

  • 嵌入式硬件中运放的基本控制原理
  • 选佳沐信,智享便捷,乐在其中
  • LeetCode——2683. 相邻值的按位异或
  • 下架的软件又复活了,低调使用!
  • HFSS许可审计与分析
  • 用 Python 批量处理 Excel:从重复值清洗到数据可视化
  • Go语言实战案例:使用context控制协程取消
  • 【工程化】tree-shaking 的作用以及配置
  • 小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
  • EP02:【DL 第二弹】张量的索引、分片、合并以及维度调整
  • WWDC 25 极地冰原撸码危机:InlineArray 与 Span 的绝地反击
  • 基于MCP的智能客服系统:知识库与工单系统深度集成
  • C++ 网络编程入门:TCP 协议下的简易计算器项目
  • 面向对象编程基础:类的实例化与对象内存模型详解
  • 什么是mysql的垂直分表,理论依据是什么,如何使用?
  • 单链表应用实践
  • 【PCIE044】基于 JFM7VX690T 的全国产化 FPGA 开发套件
  • FPGA 基本设计思想--乒乓操作、串并转换、流水线
  • 数学建模算法-day[15]
  • 【MATLAB】(八)矩阵
  • 技术与情感交织的一生 (十一)
  • HTTP 与 HTTPS 的区别深度解析:从原理到实践
  • kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题
  • 攻击实验(ARP欺骗、MAC攻击、报文洪水攻击、DNS欺骗)
  • 在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案
  • 灰色优选模型及算法MATLAB代码
  • 信息安全概述--实验总结
  • TCP如何实现可靠传输?实现细节?
  • 三极管基本放大电路静态及动态参数计算
  • 原生CSS vs LESS:样式表语言的进化之旅