当前位置: 首页 > 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.dtcms.com/a/315475.html

相关文章:

  • IP证书使用场景及注意事项
  • 16-Chapter03-Example01
  • Android Studio下载及安装配置
  • MyBatis实现SQL
  • 如何通过视觉+自动化组合拳提升UI测试的质量
  • 扣子Coze中的触发器实现流程自动化-实现每日新闻卡片式推送
  • 深入浅出 RabbitMQ-路由模式详解
  • 【2025年8月5日】mysql-8.0.38-linux-glibc2.12-x86_64.tar.xz 安装MySQL操作指引
  • 数据结构(01)—— 数据结构的基本概念
  • Wisdom SSH:自动化网络配置管理的领航者
  • 工业级 CAN 与以太网桥梁:串口服务器CAN通讯转换器深度解析(下)
  • 基于deepSeek的流式数据自动化规则清洗案例【数据治理领域AI带来的改变】
  • wps创建编辑excel customHeight 属性不是标准 Excel Open XML导致比对异常
  • 用 Python 批量处理 Excel:从重复值清洗到数据可视化
  • Unity编辑器工具:一键为场景中所有MeshRenderer对象添加指定脚本
  • 如何在服务器上部署后端程序和前端页面?
  • 在Spring Boot项目中动态切换数据源和数据库!
  • # 【Java + EasyExcel 实战】动态列 + 公式备注 Excel 模板导出全流程(附完整代码)
  • 前端实现Excel文件的在线预览效果
  • 【学习笔记】FTP库函数学习
  • 文件编译、调试及库制作
  • 人工智能领域、图欧科技、IMYAI智能助手2025年2月更新月报
  • pyspark中的kafka的读和写案例操作
  • Goby 漏洞安全通告| NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • libpq库使用
  • PDF转图片工具技术文档(命令行版本)
  • 【taro react】 ---- useModel 数据双向绑定 hook 实现
  • vue和react的框架原理
  • 基于PD控制器的四旋翼无人机群飞行控制系统simulink建模与仿真
  • SpringBoot原理揭秘--BeanFactory和ApplicationContext