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