繁体   English   中英

QListWidgdet resizeEvent QPainter :: begin:绘制设备返回的引擎== 0,类型:2

[英]QListWidgdet resizeEvent QPainter::begin: Paint device returned engine == 0, type: 2

我使类从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并向自己发出信号,但这会导致死锁。

您不应在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是私有类成员变量)。

但是,这是一个逻辑错误。 您只是不能根据窗口小部件的大小来更改图标的大小,因为它们相互依赖。 您应该使用其他一些参数进行计算(例如,如果不取决于列表的图标大小,则为顶级窗口大小)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM