QT基础篇(6)QT5图形与图片

1.QT5位置相关函数

在Qt5中,有一些与位置相关的函数可以帮助您处理窗口和控件的位置。下面是一些常用的位置相关函数:

  1. move(x, y): 将窗口或控件移动到屏幕上的指定位置,其中x和y表示要移动到的坐标。

  2. resize(width, height): 调整窗口或控件的大小,其中width和height表示新的宽度和高度。

  3. geometry(): 返回窗口或控件的几何数据,包括位置和大小。

  4. pos(): 返回窗口或控件的当前位置。

  5. size(): 返回窗口或控件的当前大小。

  6. setGeometry(x, y, width, height): 同时设置窗口或控件的位置和大小。

  7. setFixedSize(width, height): 设置窗口或控件的固定大小,禁止用户调整大小。

  8. mapToGlobal(point): 将窗口或控件坐标系中的点映射到全局坐标系中。

  9. mapFromGlobal(point): 将全局坐标系中的点映射到窗口或控件坐标系中。

这些函数可以帮助您控制窗口和控件的位置和大小,从而实现更好的用户界面布局。

2.QT5基础图形的绘制

在QT5中,可以使用QPainter类来绘制基础图形。下面是一些常见的基础图形绘制操作:

  1. 绘制直线:

    cpp 复制代码
    QPainter painter(this);
    painter.drawLine(QPointF(10, 10), QPointF(50, 50));
  2. 绘制矩形:

    cpp 复制代码
    QPainter painter(this);
    painter.drawRect(QRect(20, 20, 50, 50));
  3. 绘制椭圆:

    cpp 复制代码
    QPainter painter(this);
    painter.drawEllipse(QRect(20, 20, 50, 50));
  4. 绘制圆弧:

    cpp 复制代码
    QPainter painter(this);
    painter.drawArc(QRect(20, 20, 50, 50), 0, 180 * 16);
  5. 绘制多边形:

    cpp 复制代码
    QPainter painter(this);
    QVector<QPoint> points;
    points << QPoint(10, 10) << QPoint(50, 10) << QPoint(50, 50) << QPoint(10, 50);
    painter.drawPolygon(points);
  6. 绘制曲线:

    cpp 复制代码
    QPainter painter(this);
    QPainterPath path;
    path.moveTo(10, 10);
    path.cubicTo(40, 30, 80, 80, 120, 40);
    painter.drawPath(path);

以上代码中, this 表示绘制的目标窗口,可以根据实际情况修改为其他绘制目标。

绘制操作完成后,通过调用 QPainter::end() 方法来结束绘制过程。

3.Qt5 双缓冲机制

在Qt5中,双缓冲机制可以通过使用QWidget::setDoubleBuffered(true)函数来启用。

双缓冲机制是一种绘图优化技术,用于避免屏幕闪烁和绘图锯齿等问题。在双缓冲机制下,绘图操作首先在一个隐藏的缓冲区进行,之后再将整个缓冲区绘制到屏幕上,从而实现平滑的绘图效果。

下面是一个使用双缓冲机制的示例:

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QPainter>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        setDoubleBuffered(true);
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
        QPainter painter(this);

        // 在缓冲区绘制图形
        QPainter bufferPainter(&buffer);
        bufferPainter.fillRect(rect(), Qt::white);
        bufferPainter.drawText(rect(), Qt::AlignCenter, "Hello, World!");

        // 将缓冲区绘制到屏幕上
        painter.drawImage(rect(), buffer);
    }

private:
    QImage buffer;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

在上述示例中,我们通过将缓冲区的图像绘制到屏幕上,来避免直接在屏幕上进行绘图操作。这样可以减少对屏幕资源的频繁访问,以及减少屏幕的闪烁和锯齿效应。

注意,在使用双缓冲机制时,要确保在每次绘图操作后都调用QWidget::update()函数来触发重绘事件,以便将缓冲区的内容绘制到屏幕上。

4.显示QT5 SVG格式图片

在Qt5中,可以使用QSvgWidget来显示SVG格式的图片。以下是一个示例:

cpp 复制代码
#include <QApplication>
#include <QSvgWidget>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建并设置QSvgWidget
    QSvgWidget svgWidget;
    svgWidget.show();

    // 加载SVG文件
    QFile file("image.svg");
    if (file.open(QIODevice::ReadOnly))
    {
        svgWidget.load(&file);
        file.close();
    }

    return app.exec();
}

在上述示例中,通过创建一个QSvgWidget并调用它的load函数来加载SVG文件。你需要将SVG文件的路径指定为正确的位置。一般情况下,SVG文件可以通过QFile类来读取。

运行这段代码后,你应该会看到一个显示SVG图片的窗口。

概念解析:XML

XML(可扩展标记语言)是一种用于表示结构化数据的标记语言。它是一种通用的标记语言,被广泛应用于数据交换和存储。

XML使用标签来描述数据的结构和语义。以下是XML的一些基本特点:

  1. 可扩展性:可以通过定义自己的标记和规则来扩展XML的语义和结构。

  2. 自描述性:XML文档包含了关于其自身结构的信息。它使用标签和属性来描述数据的含义和关系。

  3. 纯文本:XML文档是纯文本文件,因此可以在不同的平台和应用程序之间轻松交换和共享。

  4. 层次结构:XML文档的数据以树状层次结构组织。它由元素、属性、文本节点和注释组成。

以下是使用XML的一些常见应用场景:

  1. 数据交换:XML常用于在不同的应用程序之间交换数据。例如,Web服务使用XML来传输数据。

  2. 配置文件:许多应用程序使用XML作为配置文件格式,以存储应用程序的设置和配置信息。

  3. 数据存储:XML也可以用于将结构化数据存储在文件或数据库中。

在Qt中,可以使用QXmlStreamReader和QXmlStreamWriter类来读取和写入XML文档。这些类提供了一种简单且灵活的方式来解析和生成XML数据。

相关推荐
longxiaozhang61 分钟前
C#异常处理:程序出错了怎么办?
开发语言·数据库·c#
郝学胜-神的一滴11 分钟前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
路多辛38 分钟前
全能型 Go Agent 框架 covonaut v1.0.8 发布:新增行内补全与多后端可观测性
开发语言·golang·agent
大模型丫丫40 分钟前
FastAPI 入门指南:从零开始构建高性能 Python API
开发语言·python·fastapi
wuyk5551 小时前
《WiFi 嵌入式物联网开发全套实战》| 第01章 WiFi整体架构详解:BSS/ESS/AP/STA模式彻底区分
开发语言·stm32·单片机·嵌入式硬件·mcu·物联网·51单片机
wuyk5551 小时前
第六章:CAN 调试工具、抓包分析、全套故障排查 + CAN-FD 进阶拓展
开发语言·stm32·单片机
2501_915106321 小时前
Swift 开发环境搭建指南:三条路径按目标对号入座
开发语言·vscode·ios·objective-c·个人开发·swift·敏捷流程
Mr. zhihao2 小时前
线上卡顿排查决策手册:场景 × 命令 × 现象 × 调整方案
java·开发语言·jvm
一直C2 小时前
【Linux应用编程】深入理解Linux多任务机制:进程原理、状态转换与进程控制实战
linux·开发语言·算法·ubuntu·vim·visual studio code
名字还没想好☜3 小时前
Python asyncio.Queue 实战:用生产者-消费者给爬虫/任务流限速又解耦
开发语言·爬虫·python·并发·asyncio