У меня довольно много головной боли.
Давайте рассмотрим следующее: у меня есть QListView с пользовательским делегатом, производным от QStyledItemDelegate.
В событии paint()
делегата я использую пользовательский виджет, который я render()
в табличном представлении. Это просто статическая визуализация, и это нормально, потому что мне нужно только показать что-то без взаимодействия.
Мой пользовательский виджет содержит QTableWidget, встроенный в вертикальный макет, и некоторые другие метки, которые я заполняю данными в sizehint()
делегата. Затем я «принудительно обновляю» макет пользовательского виджета с помощью этой техники: Qt: как заставить скрытый виджет вычислить свой макет? - см. код forceUpdate()
.
Все выглядит действительно хорошо, за исключением одного: табличный виджет моего пользовательского виджета, кажется, растет вертикально, когда это необходимо (когда я добавляю в него строки), НО строки не отображаются!!! Сжатие — это нормально, установка очень большой высоты для пользовательского виджета каким-то образом решает проблему, но это не элегантно и просто сообщает о проблеме.
Поскольку он просто отображается и, следовательно, не интерактивен, мне не нужны полосы прокрутки, но мне нужно QTableWidget для уменьшения/увеличения для отображения добавленных данных. Ни больше, ни меньше.
Пользовательский графический интерфейс виджета создается с помощью дизайнера, все настроено на динамический рост и сжатие. Где подвох? Кто-нибудь видел такое поведение? Если да, то какая комбинация магических параметров?
Немного кода для глаз:
QSize ResultsRunDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
// updating custom widget's data
item_widget->UpdateDisplay(index.row()+1);
forceUpdate(item_widget); //updating the layout
return item_widget->sizeHint(); }
void ResultsRunDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPaintDevice* originalPaintDev = painter->device();
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
painter->end();
forceUpdate(item_widget);
item_widget->render(painter->device(), QPoint(option.rect.x(), option.rect.y()), QRegion(0, 0, item_widget->rect().width()/*item_widget->sizeHint().width()*/, /*item_widget->rect().height()*/item_widget->sizeHint().height()), QWidget::DrawChildren);
painter->begin(originalPaintDev);
}
Любая помощь будет принята с благодарностью. Спасибо заранее! Я надеюсь, что название вопроса хорошее, комментарии приветствуются.