QT4 Qtableview禁用行选择

时间:2011-08-23 14:14:39

标签: qt qt4

我正在使用qtableview-s来显示sqlite表中的一些数据。我有两个基本相同的表格视图。他们都在行中显示公交车站(同一型号)。在第一个表格中,我选择离开,我想要实现的是在第二个表格中,所选条目之前的所有条目都是不可选择的,这样用户就无法向后移动来选择它们。 我能够使用 setRowHidden(row,true) 隐藏它们,但我仍希望看到它们但无法选择它们。

我尝试使用标志Qt :: ItemFlags(在自定义模型中使用flags方法)但是无论我使用什么行仍然可以选择。有没有人知道如何在QTableView中禁用行,以便仍然显示但不可选择。

3 个答案:

答案 0 :(得分:5)

感谢您的提示/帮助,但同时我找到了解决方案(我的代码中的错误)。这是我的自定义模型中的错误。我正在为物品返回错误的旗帜。 对于其他可能尝试做类似事情的人。您必须在自定义模型(QSQLQueryModel派生)中实现 flags 方法,并为您不想要选择的项返回标志 Qt :: NoItemFlags 。我正在返回 QAbstractItemModel :: flags(index)但是已经设置了一些默认标志。

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

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

 }

答案 1 :(得分:0)

对不起。自定义模型中的标志也是我唯一的想法。我假设您的原始数据源是QSQLQueryModel?您是否创建了子类并重写,或者您是否创建了QAbstractProxyModel?

答案 2 :(得分: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;
}