2010-09-29 336 views
4

我與PyQt4的(和QT完全)是一個新手,和我面臨的一個問題,如何正確地繼承QApplication?

我有子類的QApplication(產生全球性的數據和功能,真正是全球性的應用程序):

class App(QApplication): 
    def __init__(self): 
     QApplication.__init__(self) 
     self.foo = None 

    def bar(self,x): 
     do_something() 

當我嘗試一個插槽添加到我的主窗口,如:

self.connect(bar, SIGNAL('triggered()'), qApp.bar)

我得到一個錯誤: AttributeError: bar

我在做什麼錯了?或者我應該使我想要的全球的東西,global stuff而不是關閉QApplication子類的屬性和方法? (或別的東西,如果有,是什麼?)

注:這一切工作正常時,「全球性」的方法和屬性在我的QMainWindow -subclass ...

回答

3

嘗試增加QtGui.qApp = self__init__方法(或嘗試使用QApplication.instance()而不是qApp)。

我希望有幫助。

+1

前一種方法沒有奏效,'QApplication.instance()'的伎倆。謝謝! – Kimvais 2010-09-30 05:31:20

1

純面向對象的方法是:

from PySide.QtCore import * 
from PySide.QtGui import * 
import sys 

....import your classes ... 

''' 
classes needing 'global' application attributes use for example: 
QCoreApplication.instance().mainWindow 
''' 

class MyApp(QApplication): 

    def __init__(self, args): 
    super(MyApp, self).__init__(args) 
    self.mainWindow = MainWindow() # 'global' 
    ... 
    self.exec_() # enter event loop 

app = MyApp(sys.argv) # instantiate app object 

如貝特朗Meyer的「面向對象軟件構造」中所討論,一個OO程序實例化一個對象,該應用程序對象。使用main()過程是C風格程序編程的殘缺。

此外,下面的代碼可能會崩潰: 換句話說,MyApp.__init__()應該輸入主事件循環,而不是main()

... 

def main(args): 
    app = MyApp(args) 
    ... 
    sys.exit(app.exec_()) # Qt event loop 

if __name__ == "__main__": 
    main(sys.argv) 

見其他例子:http://en.wikibooks.org/wiki/Python_Programming/PyQt4