QPainter::begin: Paint device returned engine == 0, type: 1
开始
使用QPainter画图,需要继承QWidget,重写paintEvent()虚函数,在里面进行绘图。
或者可以考虑绘制到QImage或者QPixmap上面,然后在paintEvent()里面调用QPainter的绘制图像的函数。
场景
//安装事件过滤器
ui->view->installEventFilter(this);
//过滤
bool SemiA9120::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->view && event->type() == QEvent::Paint)
{
paintonPolarPlot();
} return true;/*返回 true:告诉Qt已经处理的这个事件*/
}
--------------------------------线程中---------------------------
g_testMutex.unlock();
//触发信号
ptr->sign_redrawPolar();
//信号-槽函数连接
QObject::connect(this,SIGNAL(sign_redrawRect()),this,SLOT(paintonPolarPlot()));
后来用了update()触发重绘事件
后记
update()允许Qt来优化速度并且防止闪烁。
repaint()是立即调用paintEvent(),而update()是几次执行才调用一次paintEvent()。
paintEvent()
paintEvent()是一个虚函数槽(slot),子类可以对父类的paintEvent进行重写。
当调用update(),repaint()的时候,paintEvent()会被调用,另外,当界面有任何改变的时候,paintEvent()也会被调用,这种界面的改变包括界面从隐藏到显示,界面尺寸改变,当然还包括界面内容改变的时候会被调用。
paintEvent()是已经被高度优化过的函数,它本身已经自动开启并实现了双缓冲(X11系统需要手动去开启双缓冲),因此Qt中重绘不会引起任何闪烁。
update()和repaint()
update和repaint是一类的,需要重绘的对象主动去调用,然后重绘。update和repaint调用之后,都会去调用paintEvent()
update()跟repaint()比较,update则更加有优越性。update()调用之后并不是立即重绘,而是将重绘事件放入主消息循环中,由main的event loop来统一调度的(其实也是比较快的)。update在调用paintEvent之前,还做了很多优化,如果update被调用了很多次,最后这些update会合并到一个大的重绘事件加入到消息队列,最后只有这个大的update被执行一次。同时也避免了repaint()中所提到的死循环。因此,一般情况下,我们调用update就够了,跟repaint()比起来,update是推荐使用的。
最新文章
- JDBC的操作
- socket编程进阶
- Java笔记8-抽象接口
- C++混合编程之idlcpp教程Lua篇(7)
- DOM_01之树及遍历
- Java 线程 — ScheduledThreadPoolExecutor
- 在Word2013中多次应用格式刷
- C# C++联调
- COGS 2479 偏序 题解
- Dinic 算法
- php win主机下实现ISAPI_Rewrite伪静态
- linux之SQL语句简明教程---UNION ALL
- Servlet的ClassLoader
- IT术语的正确读法
- Codeforces 1093D. Beautiful Graph【二分图染色】+【组合数】
- OCP-第三节课.md
- antd在webpack里面的配置
- pycharm的小问题之光标
- BZOJ 3878 【AHOI2014】 奇怪的计算器
- 使用JavaScript实现表现和数据分离
热门文章
- JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
- CentOS 8.2远程连接vncserver升级后1.10.1无法启动解决记录
- CentOS 7系统中的时间日期设置
- 强哥MySQL学习笔记
- centos7下iperf的安装
- SUSE12 网卡配置、SSH远程配置、解决CRT密钥交换失败,没有兼容的加密程序
- opencv——PCA(主要成分分析)数学原理推导
- Jmeter+Ant+Jenkins接口自动化框架
- MySQL 通过.frm文件和.ibd文件实现InnoDB引擎的数据恢复
- Python+Selenium - js操作