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数据。

相关推荐
云空8 分钟前
《解锁 Python 数据挖掘的奥秘》
开发语言·python·数据挖掘
青莳吖18 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall25 分钟前
期末考学C
java·开发语言
重生之绝世牛码27 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行33 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157643 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20211 小时前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频