2015-10-06 136 views
1

我有4列的tableview。當我放大主窗口的寬度時,我也需要放大第一列的寬度。qml動態列寬

舊的方式(非QML)是

QTableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); 

現在我這樣做例子波紋管,但是,這是不完全完美。 1.當我調整某個欄的大小時,此構造停止工作。所有列保持實際狀態並在主窗口改變其大小時停止調整大小。 2.當我在將來添加新列(忘記重寫此代碼行)或動態添加一些列時,此停止工作。

TableView 
    { 

     id: ccPanel 
     model: ccModel 

     TableViewColumn 
     { 
      id: ccName 
      role: "name" 
      title: "Name" 
      width: ccPanel.width - ccSize.width - ccDate.width 
     } 
     TableViewColumn 
     { 
      id: ccSize 
      role: "size" 
      title: "Size" 
      width: 60 
     } 
     TableViewColumn 
     { 
      id: ccDate 
      role: "Date" 
      title: "Datum" 
      width: 85 
     } 
    } 

你知道如何幫助我嗎?

+0

如果將'resizable'設置爲'false',那麼應該修正這些錯誤。但我不知道用戶是否應該能夠調整列大小。 – Tarod

+0

不,此設置禁止通過鼠標更改列大小。 – exo

回答

1

爲了消除奇怪調整大小,使得最後一列手動不可調整大小的,並使用從所述TabView的列的widthChanged信號以及該信號。下面的代碼產生一個非常接近Qt TableView頭部的行爲。

TableView 
{ 
    id: ccPanel 
    model: ccModel 
    anchors.fill: parent 
    onWidthChanged:ccName.width = Math.max(100, ccPanel.width - ccSize.width - ccDate.width) 

    TableViewColumn 
    { 
     id: ccName 
     role: "name" 
     title: "Name" 
     onWidthChanged: ccDate.width = Math.max(60, ccPanel.width - ccSize.width - ccName.width) 
    } 
    TableViewColumn 
    { 
     id: ccSize 
     role: "size" 
     title: "Size" 
     width: 60 
     onWidthChanged: ccDate.width = Math.max(85, ccPanel.width - ccSize.width - ccName.width) 
    } 
    TableViewColumn 
    { 
     resizable: false 
     id: ccDate 
     role: "Date" 
     title: "Datum" 
     width: 85 
    } 
} 
+0

這正是我的意思。 – exo

0

那麼,有一個解決方案,我能想到的,但它並不漂亮:每次

基本上,你需要做的手工欄目管理,跟蹤所有當前列的一個陣列,和你添加,刪除或調整列的大小,您必須執行一個函數,以動態生成列寬度的綁定:

column.height = Qt.binding(function() { return property_evaluating_expressions }) 
0

如果我在這裏,我們就是。在這個時候它並不完美,但它是解決方案。我回應調整主窗口的事件。不完美,因爲不包含實際的NAME大小。有時會在不合理的情況下將名稱增加到新值。

TableView 
    { 

     id: ccPanel 
     property var oldWidth: ccPanel.width 
     model: ccModel 

     onWidthChanged: 
     { 
      var newWidth = ccName.width + (ccPanel.oldWidth - ccName.width - ccDate.width - ccSize.width); 
      if(newWidth > 19) 
      { 
       ccName.width = newWidth 
      } 
      ccPanel.oldWidth = ccPanel.width; 
     } 

     TableViewColumn 
     { 
     ... 
     ... 
     ...