2011-06-15 57 views
9

我試圖做一些事情,似乎應該是很簡單的,但更多的我看着它,我不知道是否是一個Qt的bug。顯示一個隱藏的列QTableView中

所以,我有一個QTableView有列可以顯示/隱藏,因爲用戶喜歡。初始化表後,我調用一個自定義的restoreColumns()方法,該方法隱藏用戶上次打開GUI時隱藏的列(使用QTableView::hideColumn())。當用戶試圖表明是由用戶隱藏上次GUI是跑欄

問題然後是。相應的信號/插槽被調用並通過,但由於某種原因,QTableView未更新以顯示該列。

什麼奇怪的是,已經顯示(沒有被用戶隱藏上次GUI被RAN)的任何列有越來越隱藏/顯示沒有問題。

有什麼想法?謝謝!


下面是如何初始化表...

m_tableModel = new mytablemodel(); 
m_tableView = new mytableview(); 
m_tableView->setItemDelegate(m_tableDelegate); 
m_tableView->setModel(m_tableModel); 

肉類restoreColumns()方法:

for (int i=0; i<horizontalHeader()->count(); i++) { 
    // load size to restore previous width 
    ... 
    horizontalHeader()->resizeSection(i, width); // restore width 

    // load previous column position 
    ... 
    // restore column order 
    int currentVisualIndex = horizontalHeader()->visualIndex(i); 

    if (currentVisualIndex != visualIndex) 
     horizontalHeader()->moveSection(currentVisualIndex, visualIndex); 

    // load previous hidden/shown state 
    ... 
    if (columnHidden) { 
     hideColumn(i); 
    } else { 
     showColumn(i); 
    } 
} 

下面是一些示例代碼,顯示/隱藏的列之一。

void mytableview::showAColumn(bool checked) { 
    // mytableview is a subclass of qtableview 
    if (checked) 
     showColumn(COLUMN_A); // COLUMN_A is an enum for the column 
    else 
     hideColumn(COLUMN_A); 
} 

其被連接到可從QTableViewQHeaderView的菜單和上下文菜單訪問的QAction

connect(action, SIGNAL(toggled(bool)), this, SLOT(showAColumn(bool))); 
+0

你能試試'showColumn()'後添加['resizeColumnToContents'(http://doc.qt.nokia.com/latest/qtableview.html#resizeColumnToContents)調用? (我在想'隱藏'發生得太早了,列的大小可能無效) – Mat 2011-06-15 19:46:36

+0

試過了 - 沒有變化。我認爲這與在tableview被繪製到屏幕上之前hideColumn是如何相關的......我不確定如何在tableview被繪製後調用我的restoreColumns()方法。 – Daren 2011-06-15 21:40:29

+0

我剛剛給restoreColumns()方法增加了一些細節。這似乎是我調整列大小的地方是它變得混亂的地方。當我評論這部分時,它就像預期的那樣工作。然而,我再丟恢復到以前的列寬... – Daren 2011-06-15 22:33:52

回答

5

當您加載的隱藏列的先前的寬度,這是保存在0
因此,調整的列時確保寬度大於0
做到這一點,寬度那麼列將按預期顯示/隱藏。

+0

這應該記錄在Qt'QTableView :: hideColumn()'描述中。 – phyatt 2017-09-11 19:01:25