一个 QAction 可以用于多个任务吗?



>我使用Qt Designer创建了一个工具,其中有3个QLineEdits,分别用于translateX,translateY和translateZ。对于每个 QLineEdit,我创建了一个上下文菜单,允许我根据用户的选择为上述属性之一设置关键帧。

因此,我没有编写 3 个迎合每个属性的单独函数,而是想到使用 1 种方法"回收"它们,但我遇到了问题,因为我不太确定这是否可行,因为我使用的是单个 QAction。

class MyTool(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyTool, self).__init__(parent = parent)
        # Read off from convert uic file.
        self.ui = Ui_MyWidget()
        self.ui.setupUi(self)
        # translateX
        self.ui.xLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.ui.xLineEdit.customContextMenuRequested.connect(self.custom_menu)
        # translateY
        self.ui.yLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.ui.yLineEdit.customContextMenuRequested.connect(self.custom_menu)
        # translateZ
        self.ui.zLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.ui.zLineEdit.customContextMenuRequested.connect(self.custom_menu)
        self.popMenu = QtGui.QMenu(self)
        set_key_action = QtGui.QAction("Set Key at Current Frame", self)
        # I am having issues here..
        set_key_action.triggered.connect(self.set_key)
        self.popMenu.addAction(set_key_action)
        ...
        ...
    def set_key(self, attr):
        # assuming I am trying to effect this locator1 that already exists in the scene
        current_item = "|locator1" 
        cmds.setKeyframe("{0}.{1}".format(current_item, attr))
    def custom_menu(self, point):
        self.popMenu.exec_(QtGui.QCursor.pos())

同样,因为它只是一个 QAction,因此我被难住了......还是坚持使用 3 个单独的函数会更好?

主要问题是,当您连接触发的信号时,您不知道 QLineEdit 将被按下。我们在哪里知道QLineEdit被按下了?好吧,在方法custom_menu中,因为方法 sender(( 返回打开其上下文菜单的小部件,并且要传输它,请使用属性或数据,因此罚款是比较属性和 QLineEdit:

class MyTool(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyTool, self).__init__(parent=parent)
        # Read off from convert uic file.
        self.ui = Ui_MyWidget()
        self.ui.setupUi(self)
        for le in (self.ui.xLineEdit, self.ui.yLineEdit, self.ui.zLineEdit):
            le.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            le.customContextMenuRequested.connect(self.custom_menu)
        self.popMenu = QtGui.QMenu(self)
        self.set_key_action = QtGui.QAction("Set Key at Current Frame", self)
        self.set_key_action.triggered.connect(self.set_key)
        self.popMenu.addAction(self.set_key_action)
    def set_key(self):
        le = self.set_key_action.property("lineedit")
        # or
        # le = self.set_key_action.data()
        if le is self.ui.xLineEdit:
            print("xLineEdit")
        elif le is self.ui.yLineEdit:
            print("yLineEdit")
        elif le is self.ui.zLineEdit:
            print("zLineEdit")
    def custom_menu(self, p):
        if self.sender() is not None:
            self.set_key_action.setProperty("lineedit", self.sender())
            # or
            # self.set_key_action.setData(self.sender())
            self.popMenu.exec_(QtGui.QCursor.pos())

没有调试或源代码,我无法弄清楚这里发生了什么,因为理论上一切都有效,所以或者我无法正确理解或在代码的其他部分有一些错误。

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

super(MyTool, self).__init__(parent = parent)
    # Read off from convert uic file.
    self.ui = Ui_MyWidget()
    self.ui.setupUi(self)
    # translateX
    self.ui.xLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    self.ui.xLineEdit.customContextMenuRequested.connect(self.custom_menu)
    # translateY
    self.ui.yLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    self.ui.yLineEdit.customContextMenuRequested.connect(self.custom_menu)
    # translateZ
    self.ui.zLineEdit.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    self.ui.zLineEdit.customContextMenuRequested.connect(self.custom_menu)
    self.popMenu = QtGui.QMenu(self)
    set_key_action = QtGui.QAction("Set Key at Current Frame", self)
    **# Assuming that this phase pass !**
    set_key_action.triggered.connect(self.set_key)
    self.popMenu.addAction(set_key_action)
    ...
    ...
def set_key(self, attr):
    **# What happen when you debug this block ?**
    current_item = "|locator1" 
    cmds.setKeyframe("{0}.{1}".format(current_item, attr))
def custom_menu(self, point):
    self.popMenu.exec_(QtGui.QCursor.pos())

最新更新