Можно ли использовать QAction для нескольких задач? - PullRequest
1 голос
/ 21 июня 2019

Я создал инструмент, используя 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 отдельные функции?

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Основная проблема заключается в том, что когда вы подключаете сработавший сигнал, вы не знаете, что 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())
0 голосов
/ 21 июня 2019

Без отладки или исходного кода я не могу понять, что здесь происходит, потому что в теории все работает, поэтому или я не могу правильно понять или у меня есть какая-то ошибка в другой части кода.

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())
...