Qt使用双缓冲绘图时报错:pure virtual method called
这个问题折磨了我将近四个小时。
起始原因是想写一个双缓冲绘图的画板,大概看了一下网上的教程,理解双缓冲绘图的思想后,没有完全参照网上的步骤,想着用自己的思路实现一下。(其实和网上的教程也没有太大差别)
然后就出现问题了,出现问题的关键的代码如下:
void MainWindow::Paint()
{
if(curShape == none)
return;
int x1 = lastPoint.x();
int y1 = lastPoint.y();
int w = endPoint.x() - x1;
int h = endPoint.y() - y1; QPainter painter(&image);
tempImage = image.copy();
QPainter tempPainter(&tempImage);
switch (curShape) {
case randomLine:
painter.drawLine(lastPoint,endPoint);
lastPoint = endPoint;
break;
case line:
tempPainter.drawLine(lastPoint,endPoint);
break;
case rectangle:
tempPainter.drawRect(x1,y1,w,h);
default:
break;
}
if(!isDrawing)
{
image = tempImage.copy();
}
update();
}
在调试时,跳转到了这个地方:
QPainter::~QPainter()
{
d_ptr->inDestructor = true;
QT_TRY {
if (isActive())
end();
else if (d_ptr->refcount > 1)
d_ptr->detachPainterPrivate(this);
} QT_CATCH(...) {
// don't throw anything in the destructor.
}
if (d_ptr) {
// Make sure we haven't messed things up.
Q_ASSERT(d_ptr->inDestructor);
d_ptr->inDestructor = false;
Q_ASSERT(d_ptr->refcount == 1);
if (d_ptr->d_ptrs)
free(d_ptr->d_ptrs);
}
}
哎,感觉自己傻逼,IDE都告诉我是painter析构时出现问题了,可是我却还是在其他地方找错误,甚至把自己的代码改成和网上的一样的(能运行成功),但是我却偏不信邪,偏要用自己的思路!
最终,发现了问题的所有,问题出在这个地方:
if(!isDrawing)
{
image = tempImage.copy();
}
因为我将image强行初始化了,导致寄托在image上的painter没有析构成功。
解决方法很简单,在将image初始化之前将painter显式析构一下就可以了。
if(!isDrawing)
{
painter.~QPainter();
image = tempImage.copy();
}
Qt使用双缓冲绘图时报错:pure virtual method called的更多相关文章
- 不要在基类析构函数中调用纯虚函数,否则运行时会报错“pure virtual method called”
如上. 这是因为:delete派生类对象时,先调用派生类的析构函数,然后再调用基类的析构函数:此时如果调用纯虚函数的话,派生类的对象已经被破坏了,所以会报错. http://www.cnblogs.c ...
- [Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题
本篇读书笔记主要记录QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题 大纲: 复合模式 双缓冲绘图 绘图中的其他问题 ...
- MFC双缓冲绘图(2015.09.24)
问题引入: 最近在尝试编写贪吃蛇游戏时遇到这么一个问题:当系统以较快频率向窗口发送WM_PAINT消息时,调用OnPaint()函数在窗口中绘制图形就会发生闪烁现象. 问题分析: 当我们把绘图过程放在 ...
- MFC双缓冲绘图实例
本人之前一直了解双缓冲绘图的基本原理,但是在研究很久之后才大概知道具体的使用过程,本文将详细介绍本人在实际项目中使用双缓冲绘图的案例. 实现功能:主界面显示某张包含人脸的图片,通过dlib detec ...
- C#-gdi绘图,双缓冲绘图,Paint事件的触发
一. 画面闪烁问题与双缓冲技术 1.1 导致画面闪烁的关键原因分析: 1 绘制窗口由于大小位置状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面 ...
- 陈灯WGF双缓冲绘图框架
“木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/ WGF(windows graphic foundation)为window ...
- 双缓冲绘图和窗口控件的绘制——ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 .
双缓冲绘图和窗口控件的绘制 ---ATL ActiveX 窗口控件生成向导绘制代码OnDraw的一个错误 cheungmine 我们通常使用ATL COM组件,生成一个带窗口的ActiveX控件,然后 ...
- 简单的 "双缓冲" 绘图的例子(研究一下)
所谓双缓冲就是先画到内存画布(如: TBitmap), 然后再转帖到目的地. 譬如下面小程序: procedure TForm1.FormCreate(Sender: TObject); begin ...
- mfc双缓冲绘图
1.要求 在界面加载本地图片并显示,每过100ms改变一张图片显示 2.现象 通过定时器控制CImage,Load,Draw,Destroy,会非常的卡顿.因为Load图片时,会是非常大的数据[所有C ...
随机推荐
- doc_values VS stored field
doc_values 按列存储,按docId排序,在query阶段使用,直接根据docId获取具体field的value,用来排序,聚合等. stored field按文档存储,按docId排序,一条 ...
- OpenStack Identity API v3 extensions (CURRENT)
Table Of Contents Identity API v3 extensions (CURRENT) OS-ENDPOINT-POLICY API Associate policy and e ...
- dfs序 + 树状数组
You are given a tree, it’s root is p, and the node is numbered from 1 to n. Now define f(i) as the n ...
- Scheme实现数字电路仿真(2)——原语
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/12045295.html 作者:窗户 ...
- 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食
- limit_choices_to
# 多对多 老师 teachers = models.ManyToManyField(verbose_name='任课老师', to='UserInfo', related_name="ab ...
- MNIST数据集
一.MNIST数据集分类简单版本 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data # ...
- mong 按 geometry 搜索 地理位置信息
看 地理位置索引的使用 $near $geometry
- 投入OJ的怀抱~~~~~~~~~~
OpenJudge C20182024 信箱(1) 账号 修改设定 退出小组 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61910 ...
- 各种反弹shell方法总结
获取shell的方法总结: shell分为两种,一种是正向shell,另一种是反向shell.如果客户端连接服务器,客户端主动连接服务器,就称为正向shell.如果客户端连接服务器,服务器想要获得客户 ...