QListWidgdet resizeEvent QPainter :: begin:画图设备返回引擎== 0,键入:2

时间:2013-12-24 10:30:27

标签: c++ qt qt5 qlistwidget qevent

我从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 个答案:

答案 0 :(得分: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是私有类成员变量)。

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