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

相关推荐
hopetomorrow3 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull13 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i21 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落24 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜33 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198738 分钟前
STL关联式容器之set
开发语言·c++
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
Mr.131 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++
陌小呆^O^1 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp