QListWidgdet resizeEvent QPainter::begin: 绘制设备返回引擎 == 0,类型:2
Posted
技术标签:
【中文标题】QListWidgdet resizeEvent QPainter::begin: 绘制设备返回引擎 == 0,类型:2【英文标题】:QListWidgdet resizeEvent QPainter::begin: Paint device returned engine == 0, type: 2 【发布时间】:2013-12-24 10:30:27 【问题描述】:我让类继承自 QListWidget 并覆盖 resizeEvent:
void ListaDrzew::resizeEvent(QResizeEvent *event)
QListWidget::resizeEvent(event);
int width = event->size().width() / columnNumber - 10;
setIconSize(QSize(width, width));
setGridSize(iconSize());
但有时当我通过拆分器调整小部件的大小时,应用程序崩溃并显示以下消息:
QPainter::begin: Paint device returned engine == 0, type: 2
当用户调整小部件大小时,更改 iconSize 和 gridSize 的正确方法是什么?我尝试使用 BlockingQueuedConnection 并向自己发出信号,但这会导致死锁。
【问题讨论】:
【参考方案1】:您不应执行任何可以更改 resizeEvent
内的小部件大小的操作,因为它可能导致无限递归。看来这是你的情况。也许可以使用这个快速修复:
void ListaDrzew::resizeEvent(QResizeEvent *event)
QListWidget::resizeEvent(event);
if (!setting_new_size)
setting_new_size = true;
int width = event->size().width() / columnNumber - 10;
setIconSize(QSize(width, width));
setGridSize(iconSize());
setting_new_size = false;
(bool setting_new_size
是一个私有类成员变量)。
但是这是一个逻辑错误。您不能根据小部件大小更改图标大小,因为它们相互依赖。您应该使用其他一些参数进行计算(例如,如果它不依赖于列表的图标大小,则为***窗口大小)。
【讨论】:
以上是关于QListWidgdet resizeEvent QPainter::begin: 绘制设备返回引擎 == 0,类型:2的主要内容,如果未能解决你的问题,请参考以下文章