我试图将树的选择限制为特定的列。
我大量使用委托来创建自定义的每列行为,编辑器等。我希望可以通过阻止事件或类似的方式以某种方式从委托中执行此操作。问题是,我认为我必须创建一个模仿扩展选择的完全自定义解决方案。
但是,经过大量搜索和少量示例之后,听起来我需要在树形视图上使用自定义QItemSelectionModel。这个假设正确吗?
如何创建自定义QItemSelectionModel,它将使用扩展选择模式,但允许我忽略或还原选择(如果不在特定列中)。换句话说,单击另一列不应更改选择(不应选择或取消选择)
我知道一旦有了选择模型就如何添加它。我正在寻求实现派生类的帮助(除非可以通过连接的信号完成此操作)。
我正在使用Python,但会给予帮助。
谢谢,
[编辑:]我发现了以下类似问题:
http://lists.qt.nokia.com/pipermail/qt-interest/2010-September/027647.html
“子类QItemSelectionModel和重新实现这两个选择方法都具有
您想要的行为。只需忽略列> 0的范围部分即可。
...
或者也许只是重新实现flags()以使该项目不可选择。我不
知道那是否会有副作用。”
我尝试在我的QTreeWidgetItem上重新实现标志,但从未被调用:
def flags(self, index):
print index.column()
return super(DDOutlinerBaseItem, self).flags(index)
最佳答案
理论上,以下调整应该起作用。
上面的解决方案可以使用两个单独的方法和@pyqtSlot装饰器来消除重载的方法名称的歧义:
@pyqtSlot(QModelIndex, QItemSelectionModel.SelectionFlags)
def select(self, index, command):
# ...
@pyqtSlot(QItemSelection, QItemSelectionModel.SelectionFlags)
def select(self, selection, command):
#...
这避免了在方法实现中检查某些类实例的需要。