Qt: Как увеличить QTablewidget при рендеринге в событии рисования делегата?

У меня довольно много головной боли.
Давайте рассмотрим следующее: у меня есть 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);
}

Любая помощь будет принята с благодарностью. Спасибо заранее! Я надеюсь, что название вопроса хорошее, комментарии приветствуются.


person RDK    schedule 01.12.2016    source источник


Ответы (1)


к сожалению, sizeHint() из QTableView не зависит от его содержимого. После того, как раскладка рассчитана, можно получить идеальные размеры стола из

int width = view->verticalHeader()->width() + view->horizontalHeader()->width() + view->frameWidth()*2;
int height= view->horizontalHeader()->height() + view->verticalHeader()->height() + view->frameWidth()*2;

и соответствующим образом измените размер виджета.

person Joseph Ireland    schedule 01.12.2016
comment
Не совсем правильный ответ, но почти! tableWidget->resize(m_ui->hlBottom->sizeHint().width(), m_ui->hlBottom->sizeHint().height()); с hlBottom = горизонтальный макет, содержащий мятежный QTableWidget. Благодаря вам я нашла правильное решение своей проблемы! Я делаю это после моего forceUpdate() звонка. Большое спасибо!!! Возможно, вы можете отредактировать свой ответ, и я отмечу его как решение и т. д.;) - person RDK; 01.12.2016