【问题标题】:sending QTreeWidgetItem to a function with python使用 python 将 QTreeWidgetItem 发送到函数
【发布时间】:2014-02-01 21:01:36
【问题描述】:

我正在尝试使用 Python、Komodo 和 QT4 编写程序。

我试图在用户用鼠标选择 QTreeWidgetItem 后将其发送到函数。我所能做的就是通过鼠标移动所选点的 X 和 Y 的位置。谁能告诉我如何将 QTreeWidgetItem 发送到函数?

这是我的代码:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.treeWidget = QtGui.QTreeWidget(self.centralwidget)
        self.treeWidget.setGeometry(QtCore.QRect(155, 50, 481, 361))
        self.treeWidget.setObjectName(_fromUtf8("treeWidget"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 25))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.create_popup_menu()
        self.treeWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.treeWidget.customContextMenuRequested.connect(self.on_context_menu)
        string="default,default:cluster1,default:cluster1:clusterA,default:cluster2,default:cluster2:clusterA"
        self.retranslateUi(MainWindow)
        self.buildingTree(string)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.treeWidget.headerItem().setText(0, _translate("MainWindow", "Assignment1", None))
        __sortingEnabled = self.treeWidget.isSortingEnabled()

    def buildingTree(self, string):
        arrTree = []
        arrPath = []
        arrString = []
        arrString = string.split(",")
        root = QtGui.QTreeWidgetItem(self.treeWidget)
        root.setText(0,arrString[0])
        arrTree.append(root)
        arrString.pop(0)
        for path in arrString:
            arrPath = path.split(":")
            nameOfFather = arrPath[len(arrPath)-2]
            arrTree.reverse()
            for node in arrTree:
                nameOfNode = node.text(0)
                if nameOfNode == nameOfFather:
                    sonNode = QtGui.QTreeWidgetItem(node)
                    sonNode.setText(0,arrPath[len(arrPath)-1])
                    arrTree.insert(0,sonNode)
                    arrTree.reverse()
                    break
        self.treeWidget.setSortingEnabled(False)        

    def new_cluster(self):
        print "New Cluster"

    def rename_cluster(self):
        print "Rename cluster"

    def delete_cluster(self):
        print "Delete cluster"

    def create_popup_menu(self, parent=None):
        self.popup_menu = QtGui.QMenu(parent)
        self.popup_menu.addAction("New", self.new_cluster)
        self.popup_menu.addAction("Rename", self.rename_cluster)
        self.popup_menu.addSeparator()
        self.popup_menu.addAction("Delete", self.delete_cluster)

    def on_context_menu(self, pos):
        print "open menu"
        position = QtGui.QTreeWidgetItem(self.treeWidget)
        print position
        position = pos
        print position
        print "%%%%%%%%%%%%%%%"
        """
        node = self.treeWidget.itemAt(position)
        print node
        node = self.treeWidget.setCurrentItem(node)
        print node.text(0)
        self.popup_menu.exec_(self.treeWidget.mapToGlobal(pos))

        global_pos = self.mapToGlobal(pos)
        t = self.itemAt(pos)
        self.setCurrentItem(t)
        """

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 只将代码缩短到重要部分。没有人会阅读所有这些。阅读描述,您的问题很可能是关于将值传递给回调(您需要类似lambdapartial

标签: python contextmenu pyqt4 qtreewidget


【解决方案1】:

您的代码非常不清楚,因为您正在编辑由pyuic 生成的文件,而不是将其导入到您的主应用程序中。

我重新构建了您的代码,并使用event filter 来处理上下文菜单,这有助于稍微简化代码。我还使用lambda 函数来处理菜单操作。下面的代码假定来自pyuic 的文件保存为mainwindow_ui.py(您显然需要重新生成)。

from PyQt4 import QtCore, QtGui
from mainwindow_ui import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.buildingTree(
            "default,default:cluster1,default:cluster1:clusterA,"
            "default:cluster2,default:cluster2:clusterA"
            )
        self.treeWidget.viewport().installEventFilter(self)

    def eventFilter(self, target, event):
        if (event.type() == QtCore.QEvent.ContextMenu and
            target is self.treeWidget.viewport()):
            item = self.treeWidget.itemAt(event.pos())
            if item is not None:
                menu = QtGui.QMenu()
                menu.addAction(
                    "New", lambda: self.new_cluster(item))
                menu.addAction(
                    "Rename", lambda: self.rename_cluster(item))
                menu.addSeparator()
                menu.addAction(
                    "Delete", lambda: self.delete_cluster(item))
                menu.exec_(event.globalPos())
            return True
        return super(MainWindow, self).eventFilter(target, event)

    def new_cluster(self, item):
        print "New Cluster", item.text(0)

    def rename_cluster(self, item):
        print "Rename cluster", item.text(0)

    def delete_cluster(self, item):
        print "Delete cluster", item.text(0)

    def buildingTree(self, string):
        arrTree = []
        arrPath = []
        arrString = []
        arrString = string.split(",")
        root = QtGui.QTreeWidgetItem(self.treeWidget)
        root.setText(0,arrString[0])
        arrTree.append(root)
        arrString.pop(0)
        for path in arrString:
            arrPath = path.split(":")
            nameOfFather = arrPath[len(arrPath)-2]
            arrTree.reverse()
            for node in arrTree:
                nameOfNode = node.text(0)
                if nameOfNode == nameOfFather:
                    sonNode = QtGui.QTreeWidgetItem(node)
                    sonNode.setText(0,arrPath[len(arrPath)-1])
                    arrTree.insert(0,sonNode)
                    arrTree.reverse()
                    break
        self.treeWidget.setSortingEnabled(False)

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2018-04-10
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多