将PyQt4 QAction的triggered()与本地类可调用对象绑定似乎不起作用。如何调试?

0 投票
4 回答
4678 浏览
提问于 2025-04-15 21:51

我创建这个对象是为了生成一个 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))

可惜的是,当我选择这个菜单项时,'triggered'(触发)这个函数并没有被调用。虽然 QtCore.QObject.connect() 返回了 True,表示连接成功。

但是控制台上没有任何信息显示出有什么问题,也没有抛出异常。

我该怎么调试这个问题呢?(或者说,我哪里做错了?)

4 个回答

0

看起来你需要在你没有提供的两个类中进行调试;也就是你在这些类中添加属性,然后把它们作为参数传递给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

我在你的代码中没有看到你把 action 加到任何菜单里(实际上我哪里都没看到 addAction 的调用),而且在你的 triggered 方法里有一个奇怪的变量 checked,它在任何地方都没有定义(它是全局变量在别的地方定义的吗?)。这两个问题都表明你可能还有其他代码没有展示出来(那段代码负责把这个动作加到某个菜单或工具栏上,并定义了全局变量 checked——或者你在 def triggered 语句中漏掉了某个参数?),这些地方可能就是出错的地方(这段代码只是一个可能正确程序的 子集……但显然缺少了一些部分,我们怎么知道 它们 是正确的呢?)。

1

可能有点晚了,但我也遇到过同样的问题,我是通过把:class ActionObject(object) 改成 class ActionObject() 来解决的。

撰写回答