我正在尝试使 QStyledItemDelegate 的行为类似于我编写的自定义 QWidget,因此我可以将代码切换为模型/视图方法。
自定义 QWidget 是一个复杂的按钮,它在鼠标悬停时在其角落显示四个“子按钮”(因此总共有五个信号)。它也可以通过自定义拖动像素图进行拖放。为此,我使用了 mousePressEvent、mouseReleaseEvent、mouseMoveEvent、enterEvent 和 leaveEvent。这是有和没有鼠标悬停时显示的“子按钮”的样子:
此后,我将主要代码切换为使用模型/视图方法,并尝试将此小部件用作自定义 ListView 的 QStyledItemDelegate。我尝试将自定义小部件分配为这样的编辑器:
class ToolButtonDelegate( QStyledItemDelegate ):
def __init__( self, parent=None ):
super( ToolButtonDelegate, self).__init__( parent )
self.parent = parent
def createEditor( self, parent, option, index ):
if not index.isValid():
return False
btn = FancyButton( index.data( Qt.UserRole ), parent=parent )
return btn
这似乎很有希望,因为它为我单击的项目绘制了“FancyButton”类。但是,我需要这是一个鼠标悬停事件。经过更多研究后,我尝试将 QAbstractItemView.entered 插槽连接到 QAbstractItemView.edit 信号:
self.entered.connect( self.edit )
这仅适用于我将鼠标指针移到上方的第一项,然后出现以下错误:
edit: editing failed
所以现在我又遇到了这些问题:
- 如何正确关闭编辑器(没有“QAbstractItemView.leave”事件或类似事件)。
- 如何确保鼠标点击实际触发 FanyButton 类中的按钮,而不仅仅是与 QAbstractIremView 交互
我有一种感觉,我正朝着错误的方向前进。