2011-08-23 103 views
3

我正在使用qtableview -s來顯示來自sqlite表的一些數據。我有兩個本質上相同的表格。他們都在行中顯示巴士站(相同型號)。在第一張表中,我選擇離開,我想實現的是在第二個表中,所選的一個之前的所有條目都不可選擇,以便用戶不能後退選擇它們。 我能夠隱藏他們使用setRowHidden(row,true)但我想仍然看到他們,但無法選擇它們。QT4 Qtableview禁用行選擇

我嘗試使用標誌Qt :: ItemFlags(在自定義模型中使用標誌方法)的行,但無論我使用的行仍可選擇。有誰知道如何禁用QTableView中的行,以便仍然顯示但不可選。

回答

0

對不起。自定義模型中的標誌也是我唯一的想法。我假設你的原始數據源是QSQLQueryModel?您是否創建了子類並重寫,或者是否創建了QAbstractProxyModel?

+0

我使用了子類並重寫。這是正確的方式,因爲我發現我的代碼中的錯誤,它現在正在工作。我會發布解決方案。我從來沒有使用過QAbstractProxyModel。將不得不檢查出來。謝謝 – roko

0

您可以在QTableView上安裝一個事件過濾器,並重寫鼠標按下/鼠標移動事件(或創建一個繼承QTableView的類來做同樣的事情)。

事件過濾代碼是這樣:

從類使用QTableView中實例化&:

QTableView* view = new QTableView(this); 
view->installEventFilter(this); 

創建此同一類eventFilter方法:

bool MyClass::eventFilter(QObject* object, QEvent* event) 
{ 
    if(object == view && (event->type() == QEvent::MousePress || event->type() == QEvent::MouseMove)) { 
     // if statement to see if event position is on one of the rows you want to disable 
      // if true, return true 
    } 
    return false; 
} 
+0

我的應用程序運行在沒有鼠標鍵盤的設備上。鍵盤事件也可以實現嗎? – roko

+0

是的,它可以 - 事件過濾器允許您捕獲發送到表的所有事件。在'eventFilter'函數中,你可以檢查'event-> type()== QEvent :: KeyPress'。在那裏你會檢查按下的鍵是否是一個箭頭鍵或其他什麼可以讓你選擇一些東西。 – buck

+0

或者,您可以製作自己的QTableView類並覆蓋[setSelection](http://doc.qt.nokia.com/latest/qabstractitemview.html#setSelection)和可能的[setCurrentIndex](http://doc.qt .nokia.com/latest/qabstractitemview.html#setCurrentIndex)函數 – buck

5

感謝提示/幫助,但同時我找到解決方案(在我的代碼中有錯誤)。這是我的自定義模型中的錯誤。項目返回錯誤的標誌。 對於其他人可能會嘗試做類似的事情。你必須實現標誌方法在自定義模型(QSQLQueryModel派生)和返回標誌Qt :: NoItemFlags對於你不想選擇的項目。我正在返回QAbstractItemModel :: flags(index),但有一些默認標誌allready設置。

Qt::ItemFlags busStopsTableModel::flags(const QModelIndex &index) const 
{ 
    if(index.row()>lastDisableRowID){ 

     return QAbstractItemModel::flags(index)|Qt::ItemIsSelectable; 
    } 
    else 
    { 
     return Qt::NoItemFlags; 
    } 

}