2011-08-23 187 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; 
    } 

}