1.Qt绘图基础

(1)绘图需画笔和画布:

  • QPainter 相当于Qt中的一个画笔,绘制时需要一块画布,
  • Qt中扮演画布角色的组件为QPaintDevice和他的各个子类,如: QWidget, QPixmap, QPixture...
  • QPainter、QPaintDevice之间使用 QPaintEngine 进行通讯(也就是翻译 QPainter 的指令的意思)

(2)怎么画

  • 通常都是要在哪个 widget 上绘图,就需要在它的 paintEvent() 函数里绘图,即重写 paintEvent() 函数

(3)实例

PaintTest.h

 #ifndef PAINTTEST_H
#define PAINTTEST_H #include <QWidget>
#include <QLabel>
#include <QPainter>
class PaintTest : public QWidget
{
Q_OBJECT
private:
QLabel *la;
public:
explicit PaintTest(QWidget *parent = );
void paintEvent(QPaintEvent *); };
#endif // PAINTTEST_H

PaintTest.cpp

 #include "PaintTest.h"
#include <QLabel>
#include <QEvent >
PaintTest::PaintTest(QWidget *parent) :
QWidget(parent),la(new QLabel(this))
{
la->setText("PaintTest Label");
la->resize(,19); la->installEventFilter(this);
}
void PaintTest::paintEvent(QPaintEvent *) {
QPainter painter(this); // this 是 PaintTest 的指针
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(, , , );
}

main.cpp

 #include <QApplication>

 #include "PaintTest.h"

 int main(int argc,char* argv[])
{
QApplication a(argc, argv); PaintTest pt;
pt.show(); return a.exec();
}

2.遇到的问题

如果行绘制的图形是在Qwidget的子的组件上应该怎么绘制在哪里绘制?

一般想到的是直接在paintEvent()更改

 void PaintTest::paintEvent(QPaintEvent *) {
// QPainter painter(this); // this 是 PaintTest 的指针
QPainter painter(this->la);
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(, , , );
}

运行程序,结果并没有在 Label 上绘制出矩形,而且还输出了下面的错误:

QPainter::begin: Paint device returned engine == , type:
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
QPainter::begin: Paint device returned engine == , type:

上面1(2)提到了想要在哪个 widget 上绘图,就需要在它的 paintEvent() 函数里绘图,这里我们是想在这个Qlabel中绘图,但是paintEvent()函数是PainterTest的,所以绘制出了问题绘制不成功。

因此想要在QLabel中绘制图形,就必须新建一个类继承自QLAbel,然后在它的 paintEvent() 里绘图,如果单独就这个问题创建一个新的类就会有点小题大作了

3.解决

在事件过滤器 eventFilter() 中拦截 QLabel 的 QEvent::Paint 事件,用 QLabel 创建 QPainter,就可以在 QLabel 上绘图了

代码为

PaintTest.h

 #ifndef PAINTTEST_H
#define PAINTTEST_H #include <QWidget>
#include <QLabel>
#include <QPainter>
class PaintTest : public QWidget
{
Q_OBJECT
private:
QLabel *la;
public:
explicit PaintTest(QWidget *parent = );
// void paintEvent(QPaintEvent *);
bool eventFilter(QObject *watched, QEvent *event) ;
void magicTime();
signals: public slots: };
#endif // PAINTTEST_H

PaintTest.cpp

 #include "PaintTest.h"
#include <QLabel>
#include <QEvent >
PaintTest::PaintTest(QWidget *parent) :
QWidget(parent),la(new QLabel(this))
{
//la=new QLabel(this); la->setText("PaintTest Label");
la->resize(,); la->installEventFilter(this);
}
/*void PaintTest::paintEvent(QPaintEvent *) {
QPainter painter(this); // this 是 PaintTest 的指针
QPainter painter(this->la);
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(10, 10, 50, 50);
}*/ bool PaintTest::eventFilter(QObject *watched, QEvent *event) {
if (watched == this->la && event->type() == QEvent::Paint) {
magicTime();
} return QWidget::eventFilter(watched, event);
} void PaintTest::magicTime() {
QPainter painter(this->la );
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(, , , );
}

QPainter绘制遇到的小问题的更多相关文章

  1. PyQt5利用QPainter绘制各种图形

    这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...

  2. 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

    利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...

  3. 利用QPainter绘制散点图

    [1]实例代码 (1)代码目录结构(备注:QtCreator默认步骤新建工程) (2)工程pro文件 QT += core gui greaterThan(QT_MAJOR_VERSION, ): Q ...

  4. QT 使用QPainter 绘制图形 和 世界变换 world transform

    1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...

  5. QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)

    Qt中QPainter提供了绘制图像的API,极大地方便了我们对图像的绘制. Qt中提供了QPixmap, QBitmap,QBitMapQImage,QPicture等图像绘图设备,它们的类关系如下 ...

  6. QPainter 绘制图像接口

    阅读本文大概需要 3 分钟 我们在开发软件的过程中,绘制图像功能必不可少,使用 Qt 绘制图像时非常简单,只需要传递几个参数就可以实现功能,在 Qt 中绘制图像的 api有好几个 void drawI ...

  7. canvas绘制“飞机大战”小游戏,真香!

    canvas是ArkUI开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活.高效等优点,被广泛应用于UI界面开发中. 本期,我们将为大家介绍canvas组件的使用. 一.canvas介绍 1 ...

  8. Android 绘制view的小知识点

    [onMeasure] 直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于mat ...

  9. AI绘制毛线的小技巧

    1.新建一个500*500的画布.       2.绘制一个大小一样的正方形[颜色#060B1d]       3.绘制圆形1pt描边.       4. ctrl+c ctrl+F 原位复制圆形等比 ...

随机推荐

  1. Problem C: STL——Jerry的问题

    Description 最近Jerry正在刻苦的学习STL中的set的功能函数,他发现set可以用现有的函数实现并.交.差.对称差等功能,但是他没有找到怎么来比较两个集合是否相等的功能函数,所以他想自 ...

  2. Linux----Github环境搭建

    前面介绍了在Windows环境上安转GitHub环境,原本以为打包成jar,发布到Linux不需要再安转Git,但是因为我们使用了Config-Server配置中心,远程配置来启动,所以需要在Linu ...

  3. SPRINGMVC中的中文乱码处理

    说到乱码处理,对于很多人来说是非常经常遇到的,现在来总结一下web工程中中文乱码处理的几个步骤,乱码处理大致可以分为一下几步,分别从页面到数据库: 页面传值到后台: 工程编码(最后一开始建立工程就设置 ...

  4. c#多线程thread实例详解

    1. Thread线程启动 由于ThreadStart是一个委托,所以可以简化写法 static void Main(string[] args) { Console.WriteLine(" ...

  5. webDriver定位元素的方法

    在UI层面的自动化测试开发中,元素的定位与操作是基础,也是经常遇到的困难所在.webdriver提供了8种定位: 1. id定位:find_element_by_id("id值") ...

  6. url_encode和base64

    在用一个某开源插件做封装,想要传一些参数进去. 多数字段都是普通字符串参数,但是有一个字段传的是json,结果发现这个插件一看到大括号和双引号就识别错误了. 不想改这个插件的源码,考虑自己传进去的时候 ...

  7. Javascript学习二---DOM元素操作

    Javascript 主要包括:JS的语法,DOM和BOM操作以及ECMAScript语法. 1 获取元素的方法 获取元素方法: 通过ID:document.getElementById(); 一个 ...

  8. mysql字段默认值不生效的问题解决(上)

    在项目中使用mybatis做为持久层框架,mysql数据库.项目上线前,DBA要求我们将每张数据库表中的字段都设置默认值和not null.之前项目中有一些insert语句是将表中所有字段都列出来,然 ...

  9. 网易2019校招内推编程题-俄罗斯方块-C++实现

    [编程题] 俄罗斯方块 时间限制:1秒 空间限制:262144K 小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块.因为它比较古老,所以规则和一般的俄罗斯方块不同.荧幕上一共有 n 列,每次都会有 ...

  10. 《转》:JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    原链接:https://my.oschina.net/feichexia/blog/196575 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 ...