- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目标
我希望用户能够单击 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"))
作为调用函数中的输入之一。它不起作用,我只是将它包含在内以展示我希望找到的解决方案。
潜在相关帖子:
最佳答案
您无法重新实现 QIcon
的事件处理程序,因为它是一个简单的图像容器,与事件处理无关。这就是为什么您的扩展 QIcon
类没有执行任何操作。
此外,QTreeView
默认情况下仅绘制装饰图标。
您可以在 TreeView 中使用自定义项目委托(delegate)。QTreeView
继承自 QAbstractItemView
,它具有多个 setItemDelegate
方法 ( documentation )。然后扩展QItemDelegate
或实现QAbstractItemDelegate
。
使用 setIndexWidget()
设置自定义小部件可能会更快一些。
如果图标始终相同,您甚至可能会在 QTreeView
上使用样式表。 (documentation)
关于python - 如何使 QIcon 可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875046/
我有这个代码; void FileBrowser::setItemIcon(QStandardItem *item) { // check whether its a file or not
我想在我的 QComboBox 中的条目上包含一个“删除”图标,但我无法捕获鼠标按下事件。我试图在组合框中捕获它,并且尝试重新实现 QIcon 类以在那里捕获鼠标按下。没有骰子。有人知道怎么做吗? -
我有一个自定义文件格式,用于存储一些图像。我在程序运行期间将这些图像加载到内存中。图像以二进制格式加载(即它们在磁盘上的显示方式相同)。我知道图像的格式(几乎都是 jpeg)。问题是我不知道宽度/高度
我尝试了多种方法在 QTableWidget 单元格中显示 QIcon,但我不确定为什么它不起作用。我有一个按钮,按下时会在表格中添加一行。这是代码... void MainWindow::press
我在使用 QIcon(带有 MSVC 2008 的 Qt 4.8.1)时遇到了一些内存泄漏。 这种情况发生在简单的 QAction(如菜单条目,甚至是由 Qt Designer 自动生成的条目)或容器
我有一个带有自定义主题的应用程序,并且禁用的图标呈亮灰色。我想更改禁用的图标色调颜色。 现在我知道有这样的可能性: QTableWidgetItem *name = new QTableWidgetI
我正在尝试扩大 QIcon,但它不起作用。 class Example(QMainWindow): def __init__(self): super().__init__()
目标 我希望用户能够单击 QIcon 来执行某些操作。也就是说,我想将 QIcon 内的鼠标单击事件连接到插槽。 我尝试过的 在我的示例(如下)中,我使用 TreeView ,当用户单击其中一个图标时
我正在开发一个需要 的应用程序显示与不同文件类型关联的图标 . 例如对于 .doc 扩展,我需要它才能显示 Microsoft Word 图标 . 问题: 如何使用 QT sdk 从系统中获取 QIc
openFile = QtGui.QAction(QtGui.QIcon('Black.png'), 'Open', self) 添加 Action 后运行模块时,单击文件时,打开的 Action 没
正如 docs 中所写我想从当前代码编辑 setThemeSearchPaths() : if __name__ == "__main__": app = QtGui.QApplication
我尝试使用派生自 QSettings 的类来存储 QIcon,如下所示: setValue("fancy_icon", QIcon::fromTheme("document-new")); 但是我有一
我有一个额外的窗口,里面有一个文本编辑 + qicon(我称之为 float 编辑)。 我有 2 个 qicons - 用于通常的 DPI(16 x 16 图标),它是 2x 版本(32 x 32)。
我有一个 play button 的 png 格式图像我在其中存储为 embedded resource在我的申请中。 play.png 我已经为 Normal 和 Activ
我正在学习如何使用 Qt 进行 C++ 编程。当我单击一个按钮并且与该按钮相关的矩阵上的位置等于-1时,我想显示这张图像,我还想清除同一个按钮上的文本,我的代码到目前为止部分是: if(Tabulei
我已经为 GUI 菜单创建 QT 自定义设计器小部件工作了一段时间。这个想法是您只需将它拖到设计器中,选择您想要的帧数、每帧按钮的数量等,它就会为您生成一切并调整其大小。 小部件的结构方式有一些属性可
我正在使用 QTableView 和 QSqlTableModel 来显示来自 sqlite DB 的数据。在数据库(和模型)中,有一列包含包含路径的字段,即:“/home/foo/bar.txt”或
我想要一个文本左对齐、图标右对齐的表格单元格。 但是现在,我让图标和文本都左对齐,这是我尝试过的 QtTableWidgetItem * item = new QtTableWidgetItem("p
假设我做了这样的事情: QIcon myIcon(":/resources/icon.ico"); 我以后如何确定该图标的路径,例如 QString path = myIcon.getPath();
我想设计一个新的 QIcon 并希望它看起来像一个固定的文本,周围有一个圆角矩形 .-----. | Phy | `-----´ 当在最终应用了缩放变换的 QPainter 上绘制时,图标应该在没有“
我是一名优秀的程序员,十分优秀!