qt之ui开发

qt之ui开发

    • 前言
    • QWidget
      • setWindowFlags();
      • setAttribute
      • setstylesheet
      • 窗口的各种event
    • QLabel
    • QPushButton
    • 定时器
    • QPainter
    • qt中的坐标系


前言

在大型项目中用qt进行ui开发,通常直接通过控制对象进行开发,进行粒度更细的开发,而不是在.ui文件上做简单的拖拽


QWidget

qt的各种控件的祖宗,通常我们会继承自QWidget来进行,实现一个自己的窗口:

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
};
Widget::Widget(QWidget *parent): QWidget(parent)
{}Widget::~Widget() {}

这个构造函数正在初始化一个继承自 QWidget 的 Widget 类。构造函数接收一个可选的父类 QWidget 作为参数,并将其传递给基类 QWidget 的构造函数

setWindowFlags();

setWindowFlags 函数可以设置多个窗口标志(Qt::WindowFlags),这些标志定义了窗口的外观和行为,可以通过按位或运算符(|)组合多个窗口标志,以获得所需的效果

this->setWindowFlags(Qt::FramelessWindowHint);//设置窗口无边框,这个widget将没有标题栏等
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//无边框、置顶窗口

Qt::WindowFlags:
窗口类型:

  • Qt::Window:表示一个独立的顶层窗口
  • Qt::Popup:弹出窗口,例如右键菜单等。点击窗口外部时会自动关闭
    窗口装饰:
  • Qt::WindowTitleHint:显示窗口标题栏。
  • Qt::WindowSystemMenuHint:显示系统菜单(通常在窗口标题栏上,右键点击时弹出)。
  • Qt::SplashScreen:启动画面窗口,显示在应用程序启动时
  • Qt::FramelessWindowHint:无边框窗口,隐藏默认的标题栏和窗口边框
    窗口行为:
  • Qt::WindowStaysOnTopHint:窗口始终保持在其他窗口之上
  • Qt::WindowTransparentForInput:窗口不响应鼠标和键盘事件,类似于“点击穿透”效果
  • Qt::WindowDoesNotAcceptFocus:窗口不会接收焦点
  • Qt::MSWindowsOwnDC:指定窗口的绘制上下文(DC)应该由应用程序自己管理,而不是由窗口系统管理

setAttribute

用于设置窗口或控件的特定属性,setattribute只能一个个的设置,不能像windowflags一样用|设置多个标志位

Qt::WidgetAttribute:
外观与透明度:

  • Qt::WA_TranslucentBackground:使窗口背景透明
    输入控制:
  • Qt::WA_NoMouseReplay:禁止鼠标点击事件在控件之间重播
    窗口行为
  • Qt::WA_DeleteOnClose:当窗口关闭时,自动删除窗口对象
    渲染与更新
  • Qt::WA_PaintOnScreen:直接在屏幕上绘制控件,而不是通过窗口系统的缓冲区。这在某些情况下可以提升性能,尤其是全屏或大型窗口
    子控件与父控件的行为
  • Qt::WA_TransparentForMouseEvents:使控件对鼠标事件透明,即鼠标事件会传递到控件下层的控件中
  • Qt::WA_NoChildEventsForParent:禁止父控件接收子控件的事件通知,这在子控件多的复杂窗口布局中有助于简化事件处理

setstylesheet

设置窗口或控件的样式

//可以对于窗口内的控件进行统一的样式设置,用#来选择到设置的objectName
this->setStyleSheet("#myButton { background-color: #3498db; color: white; }""#myButton:hover { background-color: #2980b9; }""#myButton:pressed { background-color: #1c5985; }"
);
//你可以通过类型选择器设置特定类型的控件样式,比如设置所有按钮的样式
this->setStyleSheet("QPushButton { background-color: #3498db; color: white; border-radius: 5px; }");
//仅对某个控件进行设置
QPushButton *button = new QPushButton(this);
button->setStyleSheet("background-color: #3498db; color: white;");

窗口的各种event

1.鼠标事件

  • mousePressEvent(QMouseEvent *event):当鼠标按下时触发
  • mouseReleaseEvent(QMouseEvent *event):当鼠标松开时触发
  • mouseMoveEvent(QMouseEvent *event):当鼠标移动时触发
  • mouseDoubleClickEvent(QMouseEvent *event):当鼠标双击时触发

重写示例:

void MyWidget::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) {qDebug() << "Left button clicked!";}//如果需要执行父窗口的点击事件响应QWidget::mousePressEvent;
}

2.进入/离开事件

  • enterEvent(QEvent *event):当鼠标进入控件区域时触发
  • leaveEvent(QEvent *event):当鼠标离开控件区域时触发
void MyWidget::enterEvent(QEvent *event) {qDebug() << "Mouse entered the widget!";
}

3.移动事件

  • moveEvent(QMoveEvent *event):当控件被移动到屏幕的不同位置时触发

4.关闭事件

  • closeEvent(QCloseEvent *event):当窗口或控件被关闭时触发

5.调整大小事件

  • resizeEvent(QResizeEvent *event):当控件的大小发生变化时触发

6.绘制事件

  • paintEvent(QPaintEvent *event):当控件需要重新绘制时(如窗口显示、大小调整)触发

QLabel

qt中的文本框,可以设置文字和图片,比较常用

  • 设置文本内容
QLabel *label = new QLabel(this);
label->setText("Hello, QLabel!");
QString currentText = label->text();
  • 设置图片
QPixmap pixmap(":/images/icon.png");
label->setPixmap(pixmap);
label->setScaledContents(true); // 图片将自动缩放
  • 设置对齐方式
    label->setAlignment(Qt::AlignCenter); // 居中对齐
  • 设置文本字体
QFont font = label->font();      // 获取当前字体
font.setPointSize(16);           // 设置字体大小为 16
label->setFont(font);            // 应用字体
  • 设置自动换行
    label->setWordWrap(true);
  • 设置文本缩略
QFontMetrics metrics(label->font());
QString elidedText = metrics.elidedText("This is a very long text", Qt::ElideRight, 100);
label->setText(elidedText);

QPushButton

按钮控件

  • 设置文本
QPushButton *button = new QPushButton(this);
button->setText("Click Me");
QString currentText = button->text();
  • 设置按钮图标
button->setIcon(QIcon(":/icons/icon.png"));
button->setIconSize(QSize(32, 32)); // 设置图标大小为 32x32
  • 设置按钮状态
button->setEnabled(false);         // 禁用按钮
button->setCheckable(true);        // 设置按钮为可切换状态
button->setChecked(true);          // 设置为选中状态
bool isChecked = button->isChecked();

定时器

定时器默认是重复触发的,即给定一定的时间间隔,启动定时器后每隔一个时间间隔就会触发一次timeout

  • 创建定时器
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyClass::onTimeout);
  • 设置单次触发
    timer->setSingleShot(true);
  • 启动定时器
    timer.start();
    timer.start(5000);//以5s的时间间隔触发
  • 设置触发间隔
    timer->setInterval(5000);//以5s的时间间隔触发

QPainter

自定义控件或窗口的绘制

  • drawText():绘制文本。
    painter.drawText(QPoint(10, 30), “Hello, World!”);
    painter.drawText(QRect(10, 10, 100, 30), Qt::AlignCenter, “Centered Text”);

  • drawRect():绘制矩形。
    painter.drawRect(10, 10, 80, 60); // x, y, width, height

  • drawEllipse():绘制椭圆或圆。
    painter.drawEllipse(50, 50, 100, 100); // 绘制一个圆

  • drawLine():绘制直线。
    painter.drawLine(QPoint(0, 0), QPoint(100, 100));

  • drawPixmap():绘制图片。
    QPixmap pixmap(“:/path/to/image.png”);
    painter.drawPixmap(20, 20, pixmap);

  • 设置画笔 (QPen) 和画刷 (QBrush)
    QPen 用于设置线条的属性
    QBrush 用于设置填充区域的属性

QPen borderPen(QColor(0xFFFFFF)); // 边框颜色
borderPen.setWidth(2); // 边框宽度
painter->setPen(borderPen);
painter->setBrush(Qt::NoBrush);

qt中的坐标系

1.在 Qt 中,常见的坐标系有以下几种:

  • 窗口坐标系 :以窗口的左上角为原点,控件的所有子控件的相对坐标都基于这个坐标系
  • 屏幕坐标系 :以屏幕的左上角为原点,所有的控件和窗口都可以使用全局坐标来定位
  • 父窗口坐标系:对于控件,父窗口的左上角是该控件的原点,控件的相对位置基于父窗口的坐标

2.常用位置计算函数
(1) move() 和 setGeometry()

  • move(x, y):将控件移动到父窗口坐标系中的指定位置 (x, y)
  • setGeometry(x, y, width, height):设置控件的矩形区域 (x, y, width, height),包含位置和大小,位置同样是父窗口坐标系的

(2) pos() 和 geometry()

  • pos():返回控件在父窗口坐标系中的相对位置,返回值是 QPoint 类型
  • geometry():返回控件的几何形状信息,包含控件的位置和大小,返回 QRect 类型

(3) mapToParent() 和 mapFromParent()

  • mapToParent(const QPoint &point):将控件中的局部坐标 point 转换为父控件坐标系的坐标
  • mapFromParent(const QPoint &point):将父控件中的坐标 point 转换为控件本地坐标系(也称局部坐标系,是以该控件的左上角为原点 (0, 0) 的坐标系)

(4) mapToGlobal() 和 mapFromGlobal()

  • mapToGlobal(const QPoint &point):将控件的局部坐标 point 转换为屏幕全局坐标。
  • mapFromGlobal(const QPoint &point):将全局屏幕坐标 point 转换为控件的局部坐标

(5)QPoint QCursor::pos()
获取鼠标的坐标,该坐标所处的坐标系是屏幕左上角的全局坐标

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

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

相关文章

数据结构 ——— 链式二叉树oj题:将链式二叉树的前序遍历存放在数组中

题目要求 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struct BinaryTreeNode* l…

前端中的 File 和 Blob两个对象到底有什么不同

JavaScript 在处理文件、二进制数据和数据转换时&#xff0c;提供了一系列的 API 和对象&#xff0c;比如 File、Blob、FileReader、ArrayBuffer、Base64、Object URL 和 DataURL。每个概念在不同场景中都有重要作用。下面的内容我们将会详细学习每个概念及其在实际应用中的用法…

酒店叮咚门铃的类型有哪些

在酒店的环境中&#xff0c;叮咚门铃虽小&#xff0c;却有着重要的作用&#xff0c;它是客人与酒店服务人员沟通的重要桥梁。酒店叮咚门铃主要有以下几种类型&#xff1a; 有线叮咚门铃 这是较为传统的一种类型。它通过电线连接&#xff0c;通常安装在客房的墙壁上&#xff0c;…

SFW3009 多功能移动照明系统

SFW3009 多功能移动照明系统 适用范围 广泛适用于铁路、水利、电网等抢险救援现场大范围移动照明。 结构特性 灯具体积小、重量轻&#xff0c;可以实现拖行、手提、背行三种携带方式。灯具底部也可以安装铁轨轮&#xff0c;便于用户在铁轨上作业。 灯头组件由左右两个灯头…

JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)

目录 基本使用内容 下载与安装 目录结构介绍 启动与关闭 启动 关闭 可能出现的问题及解决方案 问题一&#xff1a;启动时窗口一闪而过 问题二&#xff1a;端口号冲突 问题三&#xff1a;部署应用程序 总结 基本使用内容 Tomcat 服务器在 Java Web 开发中扮演着至关重…

w032基于web的阿博图书馆管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

Java:使用Jackson解析json时如何正确获取节点中的值?

使用Jackson解析json时&#xff0c;经常会需要获取到某一节点下的值&#xff0c;例如&#xff1a; { “data”: { "test1": "value1", "test2": null, "test3": 10 } } 以Jackson2.13.5为例&#xff0c;使用at(jsonPtrExp)这种API&…

前端必懂:常见排序算法深度解析

在前端开发中&#xff0c;排序算法是一种非常重要的工具。无论是对数组进行排序以展示数据&#xff0c;还是对复杂对象进行排序以实现特定的功能&#xff0c;理解和掌握常见的排序算法对于提高开发效率和代码质量至关重要。本文将介绍几种前端常见的排序算法。 一、冒泡排序(Bu…

vue 依赖注入(Provide、Inject )和混入(mixins)

Prop 逐级透传问题​ 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一棵巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

开启鸿蒙开发之旅:核心组件及其各项属性介绍——布局容器组件

写在前面 组件的结构 rkTS通过装饰器 Component 和 Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件。 自定义组件中提供了一个 build 函数&#xff0c;开发者需在该函数内以链式调用的方式进行基本的 UI 描述 今天我们要学习的就是写在build 函数里的系…

数据结构OJ题

目录 轮转数组原地移除数组中所有元素val删除有序数组中的重复项合并两个有序数组 轮转数组 思路1&#xff1a; 1.利用循环将最后一位数据放到临时变量&#xff08;n&#xff09;中 2.利用第二层循环将数据往后移一位 3.将变量&#xff08;n&#xff09;的数据放到数组第一位 时…

Pencils Protocol 推出新板块 Auction ,为什么重要且被看好?

Pencils Protocol 上线了又一新产品板块 Auction&#xff0c;预示着生态版图的进一步完善&#xff0c;该板块的推出无论是对于 Pencils Protocol 协议本身&#xff0c;还是 Scroll 生态都是极为重要的。 社区正在成为主导加密市场发展的重要力量 自 DeFi Summer 以来&#xf…

Pytorch学习--神经网络--完整的模型训练套路

一、下载数据集 train_data torchvision.datasets.CIFAR10(root"datasets",trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue) train_data torchvision.datasets.CIFAR10(root"datasets",trainFalse,transformtorchvision.transform…

常用数字器件的描述-组合逻辑器件

目录 基本逻辑门 编码器 译码器 数据选择器 数值比较器 三态缓冲器 奇偶校验器 组合逻辑器件有逻辑门、编码器与译码器、数据选择器和数值比较器、加法器、三态器件和奇偶校验器等多种类型。 基本逻辑门 Verilog HDL中定义了实现七种逻辑关系的基元&#xff0c;例化这些…

在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能

在Django中可以使用CKEditor4和CKEditor5两个版本&#xff0c;分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4&#xff0c;python manager.py makemigrations时总是提示CKEditor4有安全风险&#xff0c;建议升级到CKEditor5。故卸载了CKEditor4&…

高效视觉方案:AR1335与i.MX8MP的完美结合

方案采用NXP i.MX8MP处理器和onsemi AR1335图像传感器&#xff0c;i.MX8MP集成四核Cortex-A53、NPU及双ISP技术。AR1335是一颗分辨率为13M的CMOS传感器。它使用了先进的BSI技术&#xff0c;提供了超高的分辨率和出色的低光性能&#xff0c;非常适合于需要高质量图像的应用。此外…

STM32软件SPI驱动BMP280(OLED显示)

STM32软件SPI驱动BMP280 OLED显示 BMP280简介寄存器简要说明SPI通讯代码逻辑代码展示 现象总结 BMP280简介 数字接口类型&#xff1a;IIC&#xff08;从模式3.4MHz&#xff09;或SPI&#xff08;3线或4线制从模式10MHz&#xff09; 气压测量范围&#xff1a;300&#xff5e;11…

基于Servlet实现MVC

目录 1.MVC相关概念 核心思想&#xff1a; 主要作用&#xff1a; 2.基于Servlet实现MVC 组成部分&#xff1a; 案例 实验步骤&#xff1a; 新建maven项目SpringMvcDemo 删除src目录并添加子模块MvcServlet ​编辑 导入相关依赖&#xff1a; 编写servlet 注册S…

剪辑师必备50多种擦拭转场/光效过渡效果Premiere Pro模板素材

项目特点&#xff1a; Premiere Pro的擦拭转场和光效闪烁过渡效果 Premiere Pro 2023及更高版本 适用于任何FPS和分辨率的照片和视频 易于使用 包含视频教程 无需插件 拖放方法 高品质 提高视频剪辑效率&#xff0c;节省时间&#xff0c;为视频创作添加独特且专业的转场风格。 …

数字化转型的架构蓝图构建指南:从理论到实践的系统实施路径

企业数字化转型的挑战与架构蓝图的重要性 在数字化浪潮的推动下&#xff0c;企业面临着前所未有的转型压力。传统业务模式和运营流程逐渐被更具弹性和敏捷性的数字化模式所取代&#xff0c;而企业架构蓝图作为战略转型的“导航仪”&#xff0c;能够为企业指明方向。企业架构治…