【问题标题】:Multiple Context menus in PyQt based on mouse locationPyQt中基于鼠标位置的多个上下文菜单
【发布时间】:2013-10-23 05:52:21
【问题描述】:

我有一个使用 QTableWidget (PyQt) 的带有多个表的窗口。我使用鼠标右键创建了一个弹出菜单,它工作正常。 但是,我需要根据单击鼠标右键时鼠标悬停在哪个表上来创建不同的弹出菜单。如何让鼠标告诉我它悬停在哪个表上?

或者,换句话说,如何实现一个方法以根据鼠标位置获得特定的上下文菜单?

我正在使用 Python 和 PyQt。

我的弹出菜单的开发类似于此代码(PedroMorgan 来自Qt and context menu 的回答):

class Foo( QtGui.QWidget ):

    def __init__(self):
        QtGui.QWidget.__init__(self, None)

        # Toolbar
        toolbar = QtGui.QToolBar()

        # Actions
        self.actionAdd = toolbar.addAction("New", self.on_action_add)
        self.actionEdit = toolbar.addAction("Edit", self.on_action_edit)
        self.actionDelete = toolbar.addAction("Delete", self.on_action_delete)

        # Tree
        self.tree = QtGui.QTreeView()
        self.tree.setContextMenuPolicy( Qt.CustomContextMenu )
        self.connect(self.tree, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu)

        # Popup Menu
        self.popMenu = QtGui.QMenu( self )
        self.popMenu.addAction( self.actionEdit )
        self.popMenu.addAction( self.actionDelete )
        self.popMenu.addSeparator()
        self.popMenu.addAction( self.actionAdd )

    def on_context_menu(self, point):
        self.popMenu.exec_( self.tree.mapToGlobal(point) )

【问题讨论】:

  • 您说的是 QTableWidget,但您的示例使用了 QTreeView。你用的是哪一个?

标签: python qt pyqt


【解决方案1】:

一种方法是继承 QTableWidget,然后实现你自己的contextMenuEvent 方法。然后,您可以为每个实例设置对上下文菜单事件的不同处理。这是一个小例子。

from PyQt4 import QtGui, QtCore
import sys

class MyTableWidget(QtGui.QTableWidget):

    def __init__(self, name='Table1', parent=None):
        super(MyTableWidget, self).__init__(parent)
        self.name = name

    def contextMenuEvent(self, event):
        menu = QtGui.QMenu(self)

        Action = menu.addAction("I am a " + self.name + " Action")
        Action.triggered.connect(self.printName)

        menu.exec_(event.globalPos())

    def printName(self):
        print "Action triggered from " + self.name


class Main(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        layout = QtGui.QVBoxLayout(self)

        self.table1 = MyTableWidget(name='Table1', parent=self)
        self.table2 = MyTableWidget(name='Table2', parent=self)

        layout.addWidget(self.table1)
        layout.addWidget(self.table2)
        self.setLayout(layout)


if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()

    app.exec_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2011-02-08
    • 2010-10-21
    • 1970-01-01
    • 2013-02-17
    • 2017-08-29
    相关资源
    最近更新 更多