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 原位复制圆形等比 ...
随机推荐
- TSMBIOS
TSMBIOS Object Pascal language (Delphi or Free Pascal). https://github.com/RRUZ/tsmbios
- c/c++ include 头文件的方式
在编写c/c++代码时,#include 头文件有两种方式:一个是#include “文件名”,一个是#include <文件名>.区别在于: 前者在程序编译时系统首先在源程序所在的目录( ...
- 汉化DevExpress
现在的DevExpress组件包提供了TcxLocalizer,拖一个放到Form上. 然后设置相关的属性: 即可完成汉化了!怎么样,够简单!!! 需要DevChs.ini文件的朋友,点击链接加入群聊 ...
- WCF分布式4:客户端访问寄宿在IIS中的WCF服务
部署过程比较简单,新建一个站点,指向服务的物理路径,设置一个端口.即可. 新建的站点对应一个应用程序池,设置应用程序池中的.NET版本为4.0 写一个测试客户端,访问IIS中的WCF服务,可能会出现, ...
- 如何开发微信小程序学习
文件中 project.config.json是开发者工具为我们自动生成的一个开发者工具的配置文件,主要是保存了一些我们对开发者工具的个性化配置. 一个微信小程序应用至少要有两个文件 一个是app.j ...
- ul li data-* 数据的读取
<ul class="questions"> <li> <div class="question">1.您的年龄是?< ...
- 2018-计算机系机试(第二批)-A-最大数
单点时限: 1.0 sec 内存限制: 256 MB 输入 n 个整数,输出其中最大数的值. 例如:3 个整数 1 ,2 和 6 的最大值是 6 . 输入格式 每一行的第一个数是 n (1≤n≤20 ...
- RN集成echarts4图表组件react-native-secharts(转载)
一个webview封装的图表组件.基于百度echarts4,相比native-echarts有echarts自带对象支持,例如渐变色等,用法与官网相同用法. echarts version 4.2.0 ...
- JDBC 链接mysql 8 的问题
转载:jdbc连接mysql 8 的一些坑 1.驱动包要升级为 mysql-connector-java-8.0.11.jar 2.JDBC driver 由“com.mysql.jdbc.Drive ...
- Sql Server 默认值
--1.取得数据库所有表的默认值: select t3.name as 表名,t1.name as 字段名,t2.text as 默认值 ,t4.name from syscolumns t1,sys ...