Привязка функции PyQt4 QAction () к вызываемому локальному классу, похоже, не работает. Как это отладить? - PullRequest
0 голосов
/ 21 апреля 2010

Я создаю этот объект, когда хочу создать QAction.Затем я добавляю эту QAction в меню:

class ActionObject(object):
  def __init__(self, owner, command):
    action = QtGui.QAction(command.name, owner)
    self.action = action
    self.command = command
    action.setShortcut(command.shortcut)
    action.setStatusTip(command.name)
    QtCore.QObject.connect(action, QtCore.SIGNAL('triggered()'), self.triggered)
  def triggered(self):
    print("got triggered " + self.command.id + " " + repr(checked))

К сожалению, когда выбран пункт меню, функция «триггер» не вызывается.QtCore.QObject.connect () возвращает True.На консоли ничего не напечатано, чтобы указать, что что-то не так, и не выдается никаких исключений.

Как я могу отладить это?(или что я делаю не так?)

Ответы [ 4 ]

1 голос
/ 08 декабря 2010

Возможно, немного поздно, но у меня была та же проблема, и я решил ее, изменив: class ActionObject(object) в class ActionObject()

0 голосов
/ 29 июля 2014

На ваши два вопроса:

1) Как мне отладить это?

1) Первое, что я бы попробовал, было бы проверить, правильно ли вы определили объявление аргумента для вашей функции (у вас). Для этого я добавил бы к вашей функции *args и **kwargs, а затем запустил код, чтобы проверить, работает ли он:

def triggered(self, *args, **kwargs):
    print("got triggered " + self.command.id + " " + repr(checked) + " [extra args: {}, kwargs: {}".format(args, kwargs))

Могу поспорить, вы обнаружите, что вы получаете логическое значение в качестве первого аргумента функции, но ваша функция была объявлена ​​как не принимающая ничего. Возможно, исключение было зарегистрировано в stderr или проглочено.

2) Я создал простой декоратор для удобства записи таких вещей:

import functools, sys
def logged_action(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        sys.stderr.write("{}: {}, {}\n".format(func, args, kwargs))
        return func(*args, **kwargs)
    return wrapped

@logged_action
def triggered(self, *args, **kwargs):
    print("got triggered " + self.command.id + " " + repr(checked))

2) (или, что я делаю не так)

Ваш подключенный метод не имеет правильной подписи, основываясь на моем опыте с примером, который я должен был передать:

Traceback (most recent call last):
  File "[redacted]", line 12, in wrapped
    return func(*args, **kwargs)
TypeError: triggered() takes exactly 1 argument (2 given)

triggered вызывается с самим собой и другим аргументом (отсюда «2 дано»), но вы только заявляете, что берете один.

0 голосов
/ 06 сентября 2010

Похоже, что ваша отладка должна происходить в одном из двух классов, которые вы не предоставляете; где вы присоединяете к ним атрибуты, а затем передаете их в ActionObject в качестве параметров.

Я создал пример без этого, так как понятия не имею, как будут выглядеть ваши два других класса. Третий, родительский класс, мне не нужен, потому что, конечно, это может быть любой универсальный класс, унаследовавший QWidget / QMainWindow / QDialog и т. Д.

class ActionObject(object):
  def __init__(self, owner=None, command=None):
    self.menuBar = QtGui.QMenuBar(self)
    self.setMenuBar(self.menuBar)
    # Make sure the menu item's parent is the menu
    self.menuGeneric = QtGui.QMenu(self.menuBar)
    self.menuGeneric.setTitle('&Generic')
    # Create and add the action in one line
    self.menuBar.addAction(self.menuGeneric.menuAction())
    QtCore.QObject.connect(self.menuGeneric, qc.SIGNAL('triggered()'), self.triggered)
  def triggered(self):
    print "got triggered"
0 голосов
/ 21 апреля 2010

Я не вижу, чтобы вы добавляли action в какое-либо меню в этом коде (на самом деле я не вижу нигде вызова addAction), и есть своеобразное использование переменной checked, которая никогда не определяется нигде в вашем triggered метод (это глобальное определение в другом месте?). Обе эти проблемы предполагают, что у вас есть другой код, который вы не показываете (код, который добавляет это действие к некоторому меню или панели инструментов и определяет глобальную переменную checked - или вы пропустили параметр в операторе def triggered, возможно ...?), и это было бы, где ошибки лежат (этот код является подмножеством потенциально правильной программы ... но ясно, что есть недостающие части, и как мы узнаем они верны? -).

...