gpt4 book ai didi

python - 如何使 QIcon 可点击?

转载 作者:太空宇宙 更新时间:2023-11-03 18:16:56 26 4
gpt4 key购买 nike

目标

我希望用户能够单击 QIcon 来执行某些操作。也就是说,我想将 QIcon 内的鼠标单击事件连接到插槽。

我尝试过的

在我的示例(如下)中,我使用 TreeView ,当用户单击其中一个图标时,我想向该节点添加一个子节点。

我尝试通过为图标重新实现 mousePressEvent 来实现此目的,但我不确定如何为 TreeView 模型中的图标(默认情况下充当纯粹的装饰器角色)执行此操作。

简化后的代码如下:

from PySide import QtGui, QtCore
import icons_rc

class Node(object):
def __init__(self, name, parentNode=None):
self.name = name
self.childNodes = []
self.parentNode = parentNode
if parentNode is not None: #if self has a parent, then add self node to parent in tree
parentNode.addChild(self)

def addChild(self, childNode):
self.childNodes.append(childNode) #

def setName(self, name):
self.name=name

def data(self):
return self.name

def child(self, row):
return self.childNodes[row]

def childCount(self):
return len(self.childNodes)

def parent(self):
return self.parentNode

def row(self):
if self.parentNode is not None: #if self has a parent, then return row of self
return self.parentNode.childNodes.index(self)


class TreeModel(QtCore.QAbstractItemModel):
#Inputs: node, Qobject
def __init__(self, root, parent=None):
QtCore.QAbstractItemModel.__init__(self, parent)
self.rootNode = root

def rowCount(self, parentIndex=QtCore.QModelIndex()):
if not parentIndex.isValid():
parentNode = self.rootNode
else:
parentNode = parentIndex.internalPointer() #picks out parent node of tree
return parentNode.childCount()

def columnCount(self, parentIndex=QtCore.QModelIndex()):
return 1

def flags(self,index):
return QtCore.Qt.ItemIsEnabled

def data(self, index, role):
if not index.isValid():
return None

node=index.internalPointer()
#role--editrole here so text doesn't disappear when you double click
if role == QtCore.Qt.DisplayRole:
if index.column() == 0:
return node.data() #node.data method defined above (string)

#icons are shown by using a decoration role
if role==QtCore.Qt.DecorationRole:
if index.column() == 0:
return QtGui.QIcon(QtGui.QPixmap(":/images/add.png"))

def setData(self, index, value, role=QtCore.Qt.EditRole):
if index.isValid():
return True
else:
return False

def getNode(self,index):
if index.isValid():
node=index.internalPointer()
if node:
return node
return self.rootNode

def parent(self, childIndex):
if not childIndex.isValid():
return QtCore.QModelIndex()
childNode = self.getNode(childIndex)
parentNode = childNode.parent()
if parentNode == self.rootNode:
return QtCore.QModelIndex()
return self.createIndex(parentNode.row(), 0, parentNode)

def index(self, row, column, parentIndex):
if not self.hasIndex(row, column, parentIndex):
return QtCore.QModelIndex()
parentNode=self.getNode(parentIndex)
childNode = parentNode.child(row) #implemented above
if childNode:
return self.createIndex(row, 0, childNode) #row/col/object yields index
else:
return QtCore.QModelIndex()


def main():
import sys
qtApp=QtGui.QApplication(sys.argv)

rootNode = Node("Hips") #for some reason, by design, this will not show
childNode0 = Node("LeftLeg", rootNode)
childNode1 = Node("RightLeg", rootNode)
childNode2 = Node("RightAnkle", childNode1)
childNode3 = Node("Middle toe", childNode2)
childNode4 = Node("Pirate flank toe", childNode2)
childNode5 = Node("Pinky toe", childNode2)

model=TreeModel(rootNode)
treeView = QtGui.QTreeView()
treeView.show() #opens empty window
treeView.setModel(model)

sys.exit(qtApp.exec_())

if __name__ == "__main__":
main()

基本上,我想构建一个事件处理程序,当我单击某个图标(add.png 中给出的图标)时,它会添加一个子级。是否有一些偷偷摸摸的路线来重新实现 mouseClickEvent 或其他图标功能?我与 Google 在这个问题上取得了零进展。

我尝试对 QIcon 进行子类化,并重新实现 mousePressEvent。目标是在 TreeModel.data() 中使用这个修改后的图标类。到目前为止,我还没有成功让类(class)开始工作。这是我尝试过的:

class ClickableQIcon(QtGui.QIcon):

def __init__(self, iconPixmap, parent):
QtGui.QIcon.__init__(self, iconPixmap, parent)

def mousePressEvent(self, event):
print "This time you pressed in an icon"

我会向它提供类似 iconPixmap=QtGui.QIcon(QtGui.QPixmap(":/images/add.png")) 作为调用函数中的输入之一。它不起作用,我只是将它包含在内以展示我希望找到的解决方案。

潜在相关帖子:

Button Icon Change on Click

QIcon inside combobox

最佳答案

您无法重新实现 QIcon 的事件处理程序,因为它是一个简单的图像容器,与事件处理无关。这就是为什么您的扩展 QIcon 类没有执行任何操作。

此外,QTreeView 默认情况下仅绘制装饰图标。

您可以在 TreeView 中使用自定义项目委托(delegate)。QTreeView 继承自 QAbstractItemView,它具有多个 setItemDelegate 方法 ( documentation )。然后扩展QItemDelegate或实现QAbstractItemDelegate

使用 setIndexWidget() 设置自定义小部件可能会更快一些。

如果图标始终相同,您甚至可能会在 QTreeView 上使用样式表。 (documentation)

关于python - 如何使 QIcon 可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com