У меня полная головная боль.
Давайте рассмотрим следующее: У меня есть QListView с пользовательским делегатом, полученным из QStyledItemDelegate.
В событии делегата paint()
я использую собственный виджет, который I render()
в представлении таблицы. Это просто рендеринг statick, и это нормально, потому что мне нужно только что-то показать без взаимодействия.
Мой пользовательский виджет содержит QTableWidget, встроенный в вертикальный макет и некоторые другие ярлыки, которые я заполняю данными в делегате sizehint()
. Затем я принудительно обновляю макет пользовательского виджета с помощью этой техники: Qt: How to force a hidden widget to calculate its layout? - см. Код forceUpdate()
.
Все кажется действительно прекрасным, кроме одного: табличный виджет моего пользовательского виджета, кажется, растет вертикально, когда это необходимо (когда я добавляю в него строки), НО строки не отображаются !!! Сокращение в порядке, хотя установка очень большой высоты для пользовательского виджета как-то устраняет проблему, но она не изящна и просто сообщает о проблеме.
Поскольку он просто отображается и поэтому не является интерактивным, я не хочу прокрутки, но мне нужно, чтобы QTableWidget уменьшался/увеличивался, чтобы показать добавленные данные. Не больше, не меньше.
Пользовательский графический интерфейс виджета выполнен с дизайнером, все настроено на динамическое увеличение и сокращение. Где поймать? Кто-нибудь видел такое поведение? Если да, то какова комбинация магических параметров?
Некоторый код для глаз:
Qt: Как вырастить 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);
}
Любая помощь будет принята с благодарностью. Thx заранее! Я надеюсь, что заголовок вопроса хорош, комментарии приветствуются.
Не совсем правильный ответ, но почти! 'tableWidget-> resize (m_ui-> hlBottom-> sizeHint(). width(), m_ui-> hlBottom-> sizeHint(). height());' с hlBottom = горизонтальный макет, содержащий непослушный QTableWidget. Благодаря вам я нашел правильное решение для своей проблемы! Я делаю это после вызова 'forceUpdate()'. Большое спасибо!!! Может быть, вы можете отредактировать свой ответ, и я укажу его как решение и т. Д .;) – RDK