2010-05-26 70 views
1

我是从PyQt4开始的,现在我遇到了一个事件问题。PyQT中事件的识别来源

我有一个主要类让我们说MainWindow。 MainWindow有一个ButtonX类型的按钮列表(内置形式QPu​​shButton)。我想实现2个解决方案之一(取决于哪个更容易)。

1)点击列表中的一个按钮后,我想运行一个MainWindow方法。我希望能够阅读那里的事件源(承认点击按钮)

2)第二种解决方案是运行ButtonX类中定义的方法。

我想的是:

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0).buttonMethod()) 

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue()")) 

,甚至这条线occure暂停Python解释器

QtCore.QObject.connect(self.getButton(0, 0), QtCore.SIGNAL("clicked()"), self.getButton(0, 0), QtCore.SLOT("incrementValue")) 

回答

4

1)单击列表中的按钮中的一个之后,我想运行MainWindow的一种方法。我希望能够读取事件的来源有(认点击的按钮)

您可以访问使用QObject.sender()事件的来源。但是,正如说明所指出的那样,使用QSignalMapper通常更好,或者以面向对象的方式进行操作。

2)第二种解决方案是运行ButtonX类中定义的方法。

self.getButton(0, 0).buttonMethod() 

以上将评估getButton与参数0, 0,然后,该对象上,呼叫buttonMethod方法:仔细在你输入的第一个连接调用的最后一个参数

看。因此,除非buttonMethod返回方法,否则您将使用返回值buttonMethod作为连接调用的最后一个参数。如果这个方法返回一个函数,那么这就好了。

相反,我希望看到类似以下内容:

self.getButton(0, 0).buttonMethod # note no parenthesis at end 

看看提供的PyQt PyQt的例子目录中,他们会表现出确切的语法,并作为很好的例子。

这里有一个小例子:

class MW(QMainWindow): 
    def __init__(self, *args) 
     QMainWindow.__init__(self, *args) 
     layout = QHBoxLayout(self) 
     self.b1 = QPushButton("Button1") 
     self.b2 = QPushButton("Button2") 
     layout.addWidget(self.b1) 
     layout.addWidget(self.b2) 
     self.connect(self.b1, SIGNAL("clicked()"), self.buttonWasPressed) 
     self.connect(self.b2, SIGNAL("clicked()"), self.buttonWasPressed) 

    def buttonWasPressed(self): 
     print "button %s was pressed" % self.sender() 
+0

在QT4你可以使用新的风格插槽和信号,在你的例子看起来会像: 'self.b1.clicked.connect(self.buttonWasPressed)' – mrossi 2013-01-29 07:34:31