Qt GUI 库总结

Qt GUI 库总结

Qt GUI 库(QtGui)是 Qt 框架中负责图形用户界面(GUI)开发的核心模块。本文将一步步详解 QtGui,从基础入门到高级应用,帮助你全面掌握其功能。以下内容包括环境配置、基本功能、核心特性及进阶技巧,配以代码示例。


1. 准备工作

  • 创建项目:在 Qt Creator 中选择 Qt Widgets Application,生成项目文件(.pro):
    QT += core gui widgets
    SOURCES += main.cpp
    

2. 入门:创建第一个窗口

使用 QWidget 创建一个简单窗口。

代码示例

#include <QApplication>
#include <QWidget>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;window.setWindowTitle("我的第一个 Qt 窗口");window.resize(400, 300);window.show();return app.exec();
}

步骤解析

  1. QApplication 初始化应用程序。
  2. QWidget 创建窗口,设置标题和大小。
  3. show() 显示窗口,exec() 启动事件循环。

结果:运行后出现一个 400x300 的空白窗口。


3. 基础功能:绘图与事件

3.1 绘图(QPainter)

使用 QPainter 在窗口上绘制图形。

代码示例

#include <QApplication>
#include <QWidget>
#include <QPainter>class MyWidget : public QWidget {
protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.setPen(Qt::red);painter.drawRect(50, 50, 100, 100);painter.drawText(70, 100, "Hello Qt");}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.resize(200, 200);window.show();return app.exec();
}

步骤解析

  1. 继承 QWidget,重写 paintEvent
  2. 使用 QPainter 绘制红色矩形和文本。

结果:窗口显示红色矩形和 “Hello Qt” 文本。

3.2 事件处理

处理用户输入,如鼠标点击。

代码示例

#include <QApplication>
#include <QWidget>
#include <QMouseEvent>
#include <QDebug>class MyWidget : public QWidget {
protected:void mousePressEvent(QMouseEvent *event) override {qDebug() << "点击坐标:" << event->pos();}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.resize(200, 200);window.show();return app.exec();
}

步骤解析

  1. 重写 mousePressEvent
  2. 使用 event->pos() 获取点击位置。

结果:点击窗口时,控制台输出坐标。


4. 核心功能:窗口与对话框

4.1 创建对话框

使用 QDialog 创建模态对话框。

代码示例

#include <QApplication>
#include <QDialog>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication app(argc, argv);QDialog dialog;dialog.setWindowTitle("对话框示例");QPushButton button("关闭", &dialog);button.setGeometry(50, 50, 80, 30);QObject::connect(&button, &QPushButton::clicked, &dialog, &QDialog::accept);dialog.exec();return app.exec();
}

步骤解析

  1. QDialog 创建对话框。
  2. 添加按钮并连接信号,点击后关闭。

结果:显示模态对话框,点击按钮关闭。


5. 进阶:自定义与动画

5.1 自定义控件

创建自定义按钮。

代码示例

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QMouseEvent>class MyButton : public QWidget {Q_OBJECT
public:MyButton(QWidget *parent = nullptr) : QWidget(parent) {setFixedSize(100, 50);}protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.setBrush(Qt::blue);painter.drawRect(0, 0, width(), height());painter.drawText(rect(), Qt::AlignCenter, "点击");}void mousePressEvent(QMouseEvent *) override {emit clicked();}signals:void clicked();
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyButton button;QObject::connect(&button, &MyButton::clicked, []() {qDebug() << "按钮被点击!";});button.show();return app.exec();
}
#include "main.moc"

步骤解析

  1. 继承 QWidget,绘制蓝色按钮。
  2. 定义 clicked 信号,点击时触发。

结果:显示蓝色按钮,点击输出消息。

5.2 添加动画

使用 QPropertyAnimation 为控件添加动画。

代码示例

#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>int main(int argc, char *argv[]) {QApplication app(argc, argv);QPushButton button("移动我");button.show();QPropertyAnimation animation(&button, "geometry");animation.setDuration(2000);animation.setStartValue(QRect(0, 0, 100, 30));animation.setEndValue(QRect(200, 200, 100, 30));animation.start();return app.exec();
}

步骤解析

  1. 创建按钮并设置动画。
  2. 定义动画起止位置,持续 2 秒。

结果:按钮从左上角移动到右下角。


6. 精通:优化与调试

6.1 性能优化

减少重绘以提升性能。

代码示例

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QTimer>class OptWidget : public QWidget {
public:OptWidget() {timer = new QTimer(this);timer->setSingleShot(true);connect(timer, &QTimer::timeout, this, &OptWidget::update);}protected:void paintEvent(QPaintEvent *) override {QPainter painter(this);painter.drawLine(0, 0, width(), height());}void resizeEvent(QResizeEvent *) override {timer->start(50); // 延迟重绘}private:QTimer *timer;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);OptWidget window;window.resize(300, 200);window.show();return app.exec();
}

步骤解析

  1. 使用 QTimer 延迟重绘。
  2. 避免频繁调整窗口大小时的重复绘制。

结果:窗口调整大小时性能更优。

6.2 调试

监视事件以调试程序。

代码示例

#include <QApplication>
#include <QWidget>
#include <QEvent>
#include <QDebug>class DebugWidget : public QWidget {
protected:bool event(QEvent *event) override {qDebug() << "事件:" << event->type();return QWidget::event(event);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);DebugWidget window;window.show();return app.exec();
}

步骤解析

  1. 重写 event() 输出事件类型。
  2. 用于跟踪程序行为。

结果:控制台显示所有事件类型。


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

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

相关文章

如何在米尔-STM32MP257开发板上部署环境监测系统

本文将介绍基于米尔电子MYD-LD25X开发板&#xff08;米尔基于STM35MP257开发板&#xff09;的环境监测系统方案测试。 摘自优秀创作者-lugl4313820 一、前言 环境监测是当前很多场景需要的项目&#xff0c;刚好我正在论坛参与的一个项目&#xff1a;Thingy:91X 蜂窝物联网原型…

网络互连与互联网3

1.SMTP简单邮件传输协议&#xff0c;用于发送电子邮件&#xff0c;默认情况下是明文传输&#xff0c;没有加密机制。 SSL是一种安全协议&#xff0c;对电子邮件进行加密传输。 POP3主要用于接收电子邮件 IMAP用于接收电子邮件 2.采用存储-转发方式处理信号的设备是交换机 …

DICOM通讯(ACSE->DIMSE->Worklist)

DICOM 通讯协议中的 ACSE → DIMSE → Worklist 这条通讯链路。DICOM 通讯栈本身是一个多层的协议结构&#xff0c;就像 OSI 模型一样&#xff0c;逐层封装功能。 一、DICOM 通讯协议栈总体架构 DICOM 通讯使用 TCP/IP 建立连接&#xff0c;其上面封装了多个协议层次&#xf…

优化自旋锁的实现

在《C11实现一个自旋锁》介绍了分别使用TAS和CAS算法实现自旋锁的方案&#xff0c;以及它们的优缺点。TAS算法虽然实现简单&#xff0c;但是因为每次自旋时都要导致一场内存总线流量风暴&#xff0c;对全局系统影响很大&#xff0c;一般都要对它进行优化&#xff0c;以降低对全…

Excel 中让表格内容自适应列宽和行高

Excel 中让表格内容自适应列宽和行高 目录 Excel 中让表格内容自适应列宽和行高自适应列宽自适应行高在Excel中让表格内容自适应列宽和行高,可参考以下操作: 自适应列宽 方法一:手动调整 选中需要调整列宽的列(如果是整个表格,可点击表格左上角行号和列号交叉处的三角形全…

JWT令牌:实现安全会话跟踪与登录认证的利器

摘要&#xff1a;本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用&#xff0c;详细介绍了JWT令牌的概念、组成、生成与校验方法&#xff0c;以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤&#xff0c;为系统的安全认证机制提供了全面且深入的…

Mybtis和Mybatis-Plus区别

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架&#xff0c;MyBatis-Plus 是在 MyBatis 基础上增强的工具包&#xff0c;让开发更便捷、高效。下面是两者主要的区别&#xff1a; ✅ 核心区别总结&#xff1a; 特性MyBatisMyBatis-Plus配置复杂度需要手写大量 XML 或注解…

JavaScript 性能优化实战

一、代码执行效率优化 1. 减少全局变量的使用 全局变量在 JavaScript 中会挂载在全局对象(浏览器环境下是window,Node.js 环境下是global)上,频繁访问全局变量会增加作用域链的查找时间。 // 反例:使用全局变量 var globalVar = example; function someFunction() {con…

学习笔记十六——Rust Monad从头学

&#x1f9e0; 零基础也能懂的 Rust Monad&#xff1a;逐步拆解 三大定律通俗讲解 实战技巧 &#x1f4e3; 第一部分&#xff1a;Monad 是什么&#xff1f; Monad 是一种“包值 链操作 保持结构”的代码模式&#xff0c;用来处理带上下文的值&#xff0c;并方便连续处理。 …

PL/SQL登录慢,程序连接Oracle 提示无法连接或无监听

PL/SQL登录慢&#xff0c;程序连接Oracle 提示无法连接或无监听 错误提示&#xff1a;ORA-12541: TNS: 无监听程序 的解决办法&#xff0c; 现象&#xff1a;PL/SQL登录慢&#xff0c;程序连接Oracle 提示无法连接或无监听 监听已经正常开起&#xff0c;但还是PL/SQL登录慢或…

Windows10,11账户管理,修改密码,创建帐户...

在这里&#xff0c;我们使用微软操作系统的一款工具:netplwiz 它可以非常便捷的管理用户账户. 一:修改密码(无需现在密码) 01修改注册表 运行命令&#xff1a;regedit 在地址栏输入&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Passwor…

电脑 BIOS 操作指南(Computer BIOS Operation Guide)

电脑 BIOS 操作指南 电脑的BIOS界面&#xff08;应为“BIOS”&#xff09;是一个固件界面&#xff0c;允许用户配置电脑的硬件设置。 进入BIOS后&#xff0c;你可以进行多种设置&#xff0c;具体包括&#xff1a; 1.启动配置 启动顺序&#xff1a;设置从哪个设备启动&#x…

iOS 冷启动时间监控:启动起点有哪些选择?

⏱️ iOS 冷启动时间监控&#xff1a;启动起点有哪些选择&#xff1f; 作者&#xff1a;侯仕奇 来源&#xff1a;sqi.io 在监控 iOS 冷启动性能时&#xff0c;一个关键问题是&#xff1a;如何精确记录 App 冷启动的开始时间&#xff1f; 本文将对不同的“冷启动起点”监控方式…

onlyoffice关闭JWT后依然报错如何解决?

onlyoffice关闭JWT后依然报错如何解决&#xff1f; 一、部署方式 我是以docker方式部署的&#xff0c;直接通过环境变量禁用了JWT&#xff0c;命令如下&#xff1a; docker run -d \--name onlyoffice-no-jwt \--restartalways \-p 8069:80 \-e JWT_ENABLEDfalse \onlyoffic…

rk3588 驱动开发(一)字符设备开发

3.字符设备驱动开发 3.1 什么是字符设备驱动 字符设备&#xff1a;就是一个个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写是按照先后顺序的。 举例子&#xff1a;IIC 按键 LED SPI LCD 等 Linux 应用程序调用驱动程序流程&#xff1a; Linux中驱动加载成功…

设计模式 --- 外观模式

外观模式是一种结构型设计模式&#xff0c;为复杂子系统提供​​统一的高层接口​​&#xff0c;通过定义一个外观类来​​简化客户端与子系统的交互​​&#xff0c;降低系统耦合度。这种模式隐藏了子系统的复杂性&#xff0c;将客户端与子系统的实现细节隔离开来&#xff0c;…

我的gittee仓库

日常代码: 日常代码提交https://gitee.com/xinxin-pingping/daily-code 有需要的宝子们可自行读取。

微服务调用中的“大对象陷阱”:CPU飙高问题解析与优化

背景 对几十万条用户历史存量数据写入&#xff0c;且存在大对象的基础上。kafka消费进行消费写mysql超时。导致上游服务调用时异常&#xff0c;CPU飙高异常。 大对象解释 大对象的定义与危害 1. 什么是大对象&#xff1f; JVM 内存分配机制&#xff1a;Java 中对象优先分配…

代码随想录算法训练营day6(字符串)

华子目录 反转字符串思路 反转字符串II思路 替换数字思路 反转字符串 https://leetcode.cn/problems/reverse-string/ 思路 使用双指针&#xff0c;初始化时&#xff0c;left指向下标0的位置&#xff0c;right指向最后一个元素的下标当while left<right时&#xff0c;交换…

Oracle 19c新特性:OCP认证考试与职业跃迁的关键?

在数字化转型的浪潮中&#xff0c;Oracle 19c作为数据库领域的旗舰版本&#xff0c;不仅承载着技术革新的使命&#xff0c;更成为IT从业者职业进阶的“黄金跳板”。无论是企业级应用的高可用性需求&#xff0c;还是云原生架构的快速迭代&#xff0c;Oracle 19c的智能化与多模型…