QT4 QTableView如何禁用行的选择功能?

3
我正在使用qtableview-s来显示来自sqlite表的一些数据。我有两个表格视图,它们本质上是相同的。它们都以行形式显示公交车站(相同的模型)。在第一个表格中,我选择了出发点,我想要实现的是,在第二个表格中,所有选定的条目之前的条目都变为不可选,以便用户无法向后移动以选择它们。 我能够使用setRowHidden(row,true)将它们隐藏,但我仍然希望能够看到它们但不能选择它们。
我尝试使用Qt :: ItemFlags标志(使用自定义模型中的flags方法)对行进行设置,但无论我使用什么,行仍然是可选择的。是否有人知道如何禁用QTableView中的行,使其仍然显示但不能选择。
3个回答

5
感谢您的提示和帮助,但与此同时我已经找到了解决方案(其实是代码中的一个错误)。我的自定义模型中有一个错误,对于项(item)返回了错误的标志(flags)。 对于其他可能会尝试类似操作的人,请注意:您必须在自定义模型(QSQLQueryModel派生)中实现 flags 方法,并返回 Qt::NoItemFlags 标志以表示您不想选定的项目。我一开始返回了 QAbstractItemModel::flags(index) 但实际上默认已经设置了一些标志(flags)。
Qt::ItemFlags busStopsTableModel::flags(const QModelIndex &index) const
 {
    if(index.row()>lastDisableRowID){

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

 }

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;
}

我的应用程序运行在没有鼠标,只有键盘的设备上。这是否也适用于键盘事件? - roko
是的,它可以 - 事件过滤器允许您捕获发送到表格的任何和所有事件。在eventFilter函数中,您将检查event->type() == QEvent::KeyPress。在那里,您将检查按下的键是否为箭头键或其他允许您选择某些内容的键。 - buck
或者,您可以创建自己的 QTableView 类并覆盖 setSelection 和可能的 setCurrentIndex 函数。 - buck

0

抱歉。在自定义模型中使用标志是我唯一的想法。我假设您的原始数据源是QSQLQueryModel?您是创建了子类并覆盖了方法,还是创建了一个QAbstractProxyModel?


我使用了子类和重写。这是正确的方法,因为我在我的代码中发现了一个错误,现在它可以正常运行了。我将发布解决方案。我从未考虑过使用QAbstractProxyModel。我必须去了解一下。谢谢。 - roko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接