Wee*_*etu 8 qt qt4 qlistview qitemdelegate pyside
我有一个QListView,我使用自定义绘图显示项目.在每个项目(即每个列表行)中,我希望能够显示一些用户可以单击的"超链接",然后调用某些功能.
我已经尝试检查官方文档(例如模型/视图编程)以及相当多的谷歌搜索,但还没有弄清楚如何实现这一目标.
我有两个想法,每个都有自己的问题:
我最初的方法是使用QListWidget和.setItemWidget(),其中我有一个带有布局和子窗口小部件的正确小部件.不幸的是,当我的列表增加到数百或数千个项目时,这太慢了.这就是我用委托更改为QListView的原因.
我似乎正在接近解决方案。
我可以通过覆盖委托的 来接收对元素的点击.editorEvent(event, model, option, index)。然后我可以找出event.type()、单击的行以及来自和index.row()的实际坐标(因为,如果事件类型是 MouseButtonRelease,则该事件是 QMouseEvent)。event.x()event.y()
由此,我认为我可以将坐标与屏幕上的元素相关联并采取相应的行动。
一旦我有了工作代码,我就会更新这个答案。
编辑
一个简单的工作示例,使用 PySide:
class MyModel(QtGui.QStandardItemModel):
def __init__(self):
super(MyModel, self).__init__()
for i in range(10): self.appendRow(QtGui.QStandardItem("Row %d" % i))
class MyDelegate(QtGui.QStyledItemDelegate):
def __init__(self, parent=None):
super(MyDelegate, self).__init__(parent)
self.links = {}
def makeLinkFunc(self, row, text):
def linkFunc(): print("Clicked on %s in row %d" % (text, row))
return linkFunc
def paint(self, painter, option, index):
painter.save()
textHeight = QtGui.QFontMetrics(painter.font()).height()
painter.drawText(option.rect.x()+2, option.rect.y()+2+textHeight, index.data())
rowLinks = {}
for i in range(3):
text = "Link %d" % (3-i)
linkWidth = QtGui.QFontMetrics(font).width(text)
x = option.rect.right() - (i+1) * (linkWidth + 10)
painter.drawText(x, y, text)
rect = QtCore.QRect(x, y - textHeight, linkWidth, textHeight)
rowLinks[rect] = self.makeLinkFunc(index.row(), text)
self.links[index.row()] = rowLinks
painter.restore()
def sizeHint(self, option, index):
hint = super().sizeHint(option, index)
hint.setHeight(30)
return hint
def editorEvent(self, event, model, option, index):
if event.type() == QtCore.QEvent.MouseButtonRelease:
for rect, link in self.links[index.row()].items():
if rect.contains(event.pos()):
link()
return True
return False
listmodel = MyModel()
listview = QtGui.QListView()
listview.setModel(listmodel)
listview.setItemDelegate(MyDelegate(parent=listview))
listview.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |