2016-12-01 11 views
1

У меня полная головная боль.
Давайте рассмотрим следующее: У меня есть 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 заранее! Я надеюсь, что заголовок вопроса хорош, комментарии приветствуются.

ответ

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; 

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^