QPainter绘制遇到的小问题
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绘制遇到的小问题的更多相关文章
- PyQt5利用QPainter绘制各种图形
这个例子我做了好几天: 1)官网C++的源码,改写成PyQt5版本的代码,好多细节不会转化 2)网上的PyQt的例子根本运行不了 填了无数个坑,结合二者,终于能完成了一个关于绘图的东西.这个过程也掌握 ...
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
- 利用QPainter绘制散点图
[1]实例代码 (1)代码目录结构(备注:QtCreator默认步骤新建工程) (2)工程pro文件 QT += core gui greaterThan(QT_MAJOR_VERSION, ): Q ...
- QT 使用QPainter 绘制图形 和 世界变换 world transform
1. 绘制椭圆 饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...
- QPainter绘制图片填充方式(正常大小、剪切大小、自适应大小、平铺)
Qt中QPainter提供了绘制图像的API,极大地方便了我们对图像的绘制. Qt中提供了QPixmap, QBitmap,QBitMapQImage,QPicture等图像绘图设备,它们的类关系如下 ...
- QPainter 绘制图像接口
阅读本文大概需要 3 分钟 我们在开发软件的过程中,绘制图像功能必不可少,使用 Qt 绘制图像时非常简单,只需要传递几个参数就可以实现功能,在 Qt 中绘制图像的 api有好几个 void drawI ...
- canvas绘制“飞机大战”小游戏,真香!
canvas是ArkUI开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活.高效等优点,被广泛应用于UI界面开发中. 本期,我们将为大家介绍canvas组件的使用. 一.canvas介绍 1 ...
- Android 绘制view的小知识点
[onMeasure] 直接继承view或ViewGroup的自定义控件需要重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于mat ...
- AI绘制毛线的小技巧
1.新建一个500*500的画布. 2.绘制一个大小一样的正方形[颜色#060B1d] 3.绘制圆形1pt描边. 4. ctrl+c ctrl+F 原位复制圆形等比 ...
随机推荐
- sdl2在vs2012上的配置
网上关于sdl2的配置教程很多,我尽量将我遇到的问题分享给大家. 首先,打开VS2012: 2.点击新建项目:选择空项目,确定即可 (文件名,保存位置,解决方案名称,可以随便填,(我取名为sdlpla ...
- NIO 概述 与 通信实例
NIO 简述: NIO是在jdk1.4之后加入的一种基于缓冲区(buffer)和通道(channel)的I/O方式, nio是同步非阻塞的i/o模式,同步是指线程不断地轮询i/o事件,非阻塞是在处理i ...
- 东芝L10安装Centos5.5
为什么安装5.5:因为高版本的需要PAE设定但是老电脑不支持,偶又不想重新编译内核,so... 1. 安装之前需要把电脑格式化(我是整机安装Linux),否则会报not enough space l ...
- Fiddler抓不到https的解决办法
这个问题可能是证书的问题,操作步骤如下: Step 1:打开系统证书管理器certmgr.msc,点击操作–查找证书,然后输入fiddler查找所有相关证书,将查找出来的结果全部删除: Step 2 ...
- java第五周作业
Java Applet Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程 ...
- ES6参数默认值
参数默认值 1.首先,来看一下es5中的函数默认值 var a = a || 10; var b = b || "none" // 当a的值或者b的值为undefined时,根据逻 ...
- redis命令Keys(九)
常用命令 1>keys 返回满足给定pattern 的所有key redis 127.0.0.1:6379> keys mylist* 1) "mylist" 2) & ...
- SQL注入之Sqli-labs系列第五十关,第五十一关,第五十二关,第五十三关(ORDER BY堆叠注入)
0x1第五十关 源码中使用的mysqli_multi_query()函数,而之前使用的是mysqli_query(),区别在于mysqli_multi_query()可以执行多个sql语句,而mysq ...
- git 安装配置
一.下载安装Git 1.下载Git 官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装 3.选择安装目录 4.选择组件 5.开始菜单目录名设置 6 ...
- thinkphp5.0--编写api,返回json格式
前几天没有写php代码,今天写了一下,今天的任务主要是构建自己的异常体系类,出现一个问题,就是返回结果不是json格式,而是一个页面,我找了一两个小时,没有找到问题,以为代码的问题,用断点调试了一通, ...