【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图

这篇具有很好参考价值的文章主要介绍了【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        绘图与图表在嵌入式里有的比较多,尤其是图表,我们常在股票里看到的“图表折线/曲线 图/饼状图等”都可以用 Qt 的图表来实现。绘图和图表的内容本章主要介绍绘图和图表的基本操作,以简单的例子呈现绘图与图表的用法,目的就是快速入门绘图与图表,关于绘图与图表详解最好是看 Qt 官方的帮助文档。

QPainter 绘图

        Qt 里的所有绘图,比如一个按钮和一个 Label 的显示,都有绘图系统来执行。绘图系统基于 QPainter、QPaintDevice 和 QPainEngine 类。QPainter 是可以直接用来操作绘图的类,而 QPaintDevice 和 QPainEngine 都比 QPainter 更底层,我们只需要了解一下 QPaintDevice 和 QPainEngine 就行了。可以用下面一张图来表示它们的关系。

【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图,Linux,Qt,qt,开发语言,ui,ubuntu,linux

        一般用于显示的类,如 QWidget、QPixmap、QImage、Qlabel 等可视类控件都可以充当绘 图区域的“画布”,从 QWidget 继承的类都有 virtual void paintEvent(QPaintEvent *event);属性。这个 paintEvent()是一个虚函数,它在 qwidget.h 头文件的 protected:修饰符下。

        paintEvent()事件可以被重写。(解释:什么是绘图事件?可以这么理解,当界面初始化或者需要刷新时才会执行的事件,也就是说绘图事件在构造对象实例化时会执行,需要刷新界面我们可以使用 update()方法执行 paintEvent()事件)。

        paintEvent()事件是父类 QWidget 提供给子类的接口,在父类里定义为空,所以可以说 paintEvent()事件就是专门给子类画图用的。

        paintEvent()事件在子类重写的基本结构如下:

void Widget::paintEvent(QPaintEvent *)
{
    /* 指定画图的对象,this 代表是本 Widget */
    QPainter painter(this);
    // 使用 painter 在对象上绘图...
}

应用实例

        本例目的:快速了解 paintEvent()事件的使用。

        项目名称:qpainter。本例使用一张 CD 图片,用 QPainter 在 paintEvent()将 CD 画在窗口的中心,并且每 100ms 旋转 1 度角度。所以 CD 看起来是旋转了的效果。

        头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    /* 重写父类下的protected方法*/
protected:
    void paintEvent(QPaintEvent *);

private:
    /* 定时器,用于定时更新界面 */
    QTimer *timer;
    /* 角度 */
    int angle;

private slots:
    /* 槽函数 */
    void timerTimeOut();

};
#endif // MAINWINDOW_H

        因为 paintEvent()是父类 QWidget 的 protected 修饰符下虚方法(虚函数),所以建议重写时也写到子类下的 protected 修饰符下。

        在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"
#include "QDebug"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置主窗口位置及颜色 */
    this->setGeometry(0, 0, 800, 480);
    setPalette(QPalette(Qt::gray));
    setAutoFillBackground(true);

    /* 定时器实例化 */
    timer = new QTimer(this);

    /* 默认角度为0 */
    angle = 0;

    /* 定时100ms */
    timer->start(100);

    /* 信号槽连接 */
    connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeOut()));
}

MainWindow::~MainWindow()
{
}

void MainWindow::timerTimeOut()
{
    /* 需要更新界面,不设置不更新 */
    this->update();
}

void MainWindow::paintEvent(QPaintEvent *)
{
    /* 指定父对象,this指本窗口 */
    QPainter painter(this);

    /* 设置抗锯齿,流畅转换 */
    painter.setRenderHints(QPainter::Antialiasing
                           | QPainter::SmoothPixmapTransform);
    /* 计算旋转角度 */
    if (angle++ == 360)
        angle = 0;

    /* QPixmap类型对象 */
    QPixmap image;

    /* 加载 */
    image.load(":/image/cd.png");

    /* QRectF即,继承QRect(Qt的矩形类),F代表精确到浮点类型 */
    QRectF rect((this->width() - image.width()) / 2,
                (this->height() - image.height()) / 2,
                image.width(),
                image.height());

    /* 默认参考点为左上角原点(0,0),因为旋转需要以图形的中心为参考点,
     * 我们使用translate把参考点设置为CD图形的中心点坐标 */
    painter.translate(0 + rect.x() + rect.width() / 2,
                      0 + rect.y() + rect.height() / 2);

    /* 旋转角度 */
    painter.rotate(angle);

    /* 现在参考点为CD图形的中心,我们需要把它设置回原点的位置,
     * 所以需要减去上面加上的数 */
    painter.translate(0 - (rect.x() + rect.width() / 2),
                      0 - (rect.y() + rect.height() / 2));

    /* 画图,QPainter提供了许多drawX的方法 */
    painter.drawImage(rect, image.toImage(), image.rect());

    /* 再画一个矩形 */
    painter.drawRect(rect.toRect());
}

        首先实现paintEvent()。先指定需要画图的对象,加图片后,使用 translate() 设置参考原点,旋转一定的角度后再恢复参考原点。之后就开始画图。在参考原点处可能比较难理解,大家根据上面的注释多多分析。

        然后,定时100ms 更新一次界面。因为 paintEvent事件在构造函数执行时只会执行一次。 我们需要使用 update()方法来更新界面,才能看到 CD 旋转的效果。

程序运行效果

        编译运行程序后可以看到如下效果,CD 的外框加画了一个矩形,使旋转更明显。使用 paintEvent 可以实现一些需要绘图的情景,它可能比 Qt 动画类更容易实现。结合 Qt 的画笔, 也可以设计一个绘图软件,这多得益于 paintEvent()与 QPainter 使界面开发多了一些可能。在界面设计里,重绘界面使用 paintEvent()也比较多,需要我们掌握这部分内容。

【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图,Linux,Qt,qt,开发语言,ui,ubuntu,linux

 文章来源地址https://www.toymoban.com/news/detail-531669.html

到了这里,关于【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

            Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面(Graphical User Interface,简 称 GUI)程序。         Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部; Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多

    2024年02月16日
    浏览(60)
  • 【嵌入式Qt开发入门】在Ubuntu下编写C++

            在 Ubuntu 上面编写 C++,本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C++源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C++。这里要求大家会在 Ubuntu 上使用 vi/vim,也就是要求大家有一点 Ubuntu 入门的基

    2024年02月11日
    浏览(45)
  • 使用Yocto进行嵌入式Linux开发3 Toaster

    我们已经知道了如何在Poky中使用BitBake构建图像image,那么我们将学习如何使用Toaster完成同样的操作。 Toaster是一个用于配置和运行构建的Web接口。它与BitBake和Poky构建系统通信,以管理和收集有关构建、软件包和镜像的信息。 使用Toaster的两种方法: 本地 可以将Toaster作为本

    2024年02月08日
    浏览(43)
  • 嵌入式开发--CubeMX使用入门教程

    嵌入式开发–CubeMX使用入门教程 传统的单片机开发时,需要针对片上外设做各种初始化的工作,相当麻烦。 CubeMX是ST公司出品的一款图形化代码生成工具,通过图形化界面,可以非常直观的配置好各种片上外设,时钟,中断,DMA等等各种设备的参数,然后CubeMX可以直接生成初

    2024年04月12日
    浏览(62)
  • 使用Yocto进行嵌入式Linux开发1 Yocto简介

    Yocto项目是Linux基金会的一个工作组,它是一个开源协作项目,帮助开发人员创建基于Linux的定制系统,这些系统专为嵌入式产品而设计,与产品的硬件架构无关。Yocto项目提供了一个灵活的工具集和开发环境,使世界各地的嵌入式设备开发人员能够通过共享技术、软件栈、配

    2024年02月09日
    浏览(50)
  • 使用VSCode clangd插件进行linux内核代码阅读和嵌入式开发

    在进行 Linux 内核代码阅读和嵌入式开发时,选择合适的开发工具至关重要。VSCode 是一个流行的跨平台编辑器,并且它的扩展生态系统非常强大。在这篇博客中,我们将介绍如何使用 VSCode Clangd 插件来提高 Linux 内核代码的阅读和嵌入式开发效率。 Clangd 是一个基于 Clang 的语言

    2024年02月09日
    浏览(51)
  • 使用Yocto进行嵌入式Linux开发2 第一个基于Poky的系统

    Ubuntu: Fedora 在我们的开发主机系统上安装了所需的软件包后,我们可以使用 Git 下载当前 LTS 版本的 Poky 源代码,命令如下: 下载完成后,poky 目录中的内容如下: 在poky目录中存在oe-init-build-env脚本,用于设置构建环境。 这里,[build-directory] 是一可选参数,用于指定配置环境

    2024年02月08日
    浏览(49)
  • 嵌入式开发板qt gdb调试

    1) 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253, 进入命令行执行如下: chmod 777 /home/HelloWorld (2) 打 开 QTcreator-Debug-StartDebugging-Attach to Running Debug Server 进行如下设置,设置监听端口10000. 点击上图中的按钮,由于按钮中的函数设置了断点,则跳到断点,界面如下

    2024年02月04日
    浏览(95)
  • 嵌入式Qt 开发一个音乐播放器

    上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于Qt是支持跨平台的,因此本篇的音乐播放器,先在Windows上编写

    2024年02月02日
    浏览(50)
  • 嵌入式QT- QT使用MQTT

    目录 一、MQTT介绍 二、MQTT概念   2.1 订阅(Subscribtion)   2.2 会话(Session)   2.3 主题名(Topic Name)    2.4 主题筛选器(Topic Filter)    2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平台安装mosquitto 4.1 下载 mosquitto 服务器 4.2 下载 mosquitto 客户端 4.3 mosquitto 命令

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包