我正在使用qtableview-s来显示sqlite表中的一些数据。我有两个基本相同的表格视图。他们都在行中显示公交车站(同一型号)。在第一个表格中,我选择离开,我想要实现的是在第二个表格中,所选条目之前的所有条目都是不可选择的,这样用户就无法向后移动来选择它们。 我能够使用 setRowHidden(row,true) 隐藏它们,但我仍希望看到它们但无法选择它们。
我尝试使用标志Qt :: ItemFlags(在自定义模型中使用flags方法)但是无论我使用什么行仍然可以选择。有没有人知道如何在QTableView中禁用行,以便仍然显示但不可选择。
答案 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;
}