Я сделал класс наследовать от 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
является закрытой переменной члена класса).
Однако это логическая ошибка. Вы просто не можете изменить размер значка в зависимости от размера виджета, потому что они зависят друг от друга. Вы должны использовать какой-то другой параметр для расчета (например, размер окна верхнего уровня, если он не зависит от размера иконки в списке).
Других решений пока нет …