2016-12-01 53 views
1

我很頭疼。
讓我們考慮下面的內容: 我有一個QListView與從QStyledItemDelegate派生的自定義委託。
在代表的paint()事件中,我在桌面視圖中使用了一個自定義小部件,即render()。這只是一個statick渲染,並沒有問題,因爲我只需要顯示一些內容而不需要互動。
我的自定義小部件包含一個嵌入在垂直佈局中的QTableWidget,以及一些用代理的sizehint()中的數據填充的其他標籤。然後我用這種技術「強制更新」自定義小部件的佈局:Qt: How to force a hidden widget to calculate its layout? - 請參閱forceUpdate()代碼。
似乎一切都很好,除了一件事:我的自定義小部件的tablewidget似乎在需要時垂直增長(當我添加行時),但行不會呈現!收縮是可以的,但是爲自定義小部件設置一個非常大的高度以某種方式修復了這個問題,但它不夠高雅,只是報告問題。
由於它只是呈現,因此不交互,我不想滾動條,但我需要QTableWidget縮小/增長顯示添加的數據。沒有更多,不少。
自定義小部件的GUI由設計師製作,一切都設置爲動態增長和縮小。漁獲何處?有沒有人看過這樣的行爲?如果是,什麼是魔術參數組合?

的眼睛有些代碼:
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

一個QTableViewsizeHint()並不取決於它的內容很遺憾。在佈局計算之後,您可以從

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

中獲得理想的尺寸,並相應地調整您的小部件的大小。

+0

不是正確的答案,但幾乎! (。m_ui-> hlBottom-> sizeHint()寬度(),m_ui-> hlBottom-> sizeHint()高度())'tableWidget->調整大小;'與hlBottom =含有rebelious QTableWidget的水平佈局。感謝你,我爲我的問題找到了正確的解決方案!我在'forceUpdate()'調用後執行它。非常感謝!!!也許你可以編輯你的答案,並將其標記爲解決方案等;) – RDK