QT4 Qtableview 禁用行选择

发布于 2024-11-30 18:09:28 字数 324 浏览 0 评论 0原文

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

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

I am using qtableview-s to show some data from sqlite tables. I have 2 tableviews which are essentialy same. They are both showing bus stops (same model) in rows. In first table i am selecting departure and what i would like to achieve is that in second table all entries before the selected one are made non selectable so that user cannot move backward to select them.
I was able to hide them using setRowHidden(row,true) but i would like still to see them but not be able to select them.

I tried using flags Qt::ItemFlags (using flags method in custom model) for the row but no matter what i use the rows are still selectable. Does anyone know how to disable row in QTableView so that is still shown but not selectable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

悸初 2024-12-07 18:09:28

感谢您的提示/帮助,但同时我找到了解决方案(以及我的代码中的错误)。这是我的自定义模型中的错误。我为项目返回了错误的标志。
对于其他可能尝试做类似事情的人。您必须在自定义模型(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;
    }

 }

Thanks for the tips/help but in the mean time i found solution (well bug in my code). It was bug in my custom model. I was returning wrong flags for item.
For others that might try to do something similar. You have to implement flags method in custom model (QSQLQueryModel derived) and return flag Qt::NoItemFlags for items that you dont want selected. I was returning QAbstractItemModel::flags(index) but there are some default flags allready set.

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

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

 }
情话难免假 2024-12-07 18:09:28

对不起。定制模型中的旗帜也是我唯一的想法。我假设您的原始数据源是 QSQLQueryModel?您是否创建了子类并覆盖,或者创建了 QAbstractProxyModel?

Sorry. The flags in custom model was my only idea too. I'm assuming your original data-source is QSQLQueryModel? Did you create a subclass and override, or did you create a QAbstractProxyModel?

欢烬 2024-12-07 18:09:28

您可以在 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;
}

You could install an event filter on the QTableView and override mouse press / mouse move events (or create a class inheriting QTableView to do the same thing).

Event filter code would look like:

From the class instantiating & using the QTableView:

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

Create the eventFilter method for this same class:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文