QListWidgdet resizeEvent QPainter :: begin: устройство рисования возвратило двигатель == 0, тип: 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 и излучать сигнал себе, но это делает мертвую блокировку.

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 является закрытой переменной члена класса).

Однако это логическая ошибка. Вы просто не можете изменить размер значка в зависимости от размера виджета, потому что они зависят друг от друга. Вы должны использовать какой-то другой параметр для расчета (например, размер окна верхнего уровня, если он не зависит от размера иконки в списке).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]