2014-10-28 63 views
1

當我點擊按鈕時,「ChildWindow」會閃爍並消失。然後如果我添加函數exec_(),它會報告一個「AttributeError」,因爲「QMainWindow」沒有這個屬性。 如何修改「showChildWindow」函數以使其可以正常工作?謝謝。如何避免孩子QMainWindow消失?

import sys 
from PyQt4 import QtCore, QtGui 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle("MainWindow Window!") 
     self.setGeometry(400, 400, 100, 100) 
     self.centerWidget = QtGui.QWidget() 
     self.setCentralWidget(self.centerWidget) 

     self.pushButton = QtGui.QPushButton("&Button") 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.pushButton) 
     self.centerWidget.setLayout(layout)  

class ChildWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle("Child Window!") 

def showChildWindow(): 
    mw = MainWindow() 
    child_win = ChildWindow(mw) 
    child_win.show() 
    #child_win.exec_()      #AttributeError: 'ChildWindow' object has no attribute 'exec_' 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = MainWindow() 
    myapp.show() 
    QtCore.QObject.connect(myapp.pushButton,QtCore.SIGNAL("clicked()"),showChildWindow) 
    sys.exit(app.exec_()) 

該程序可以正常工作。

import sys 
from PyQt4 import QtCore, QtGui 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle("MainWindow Window!") 
     self.setGeometry(400, 400, 100, 100) 
     self.centerWidget = QtGui.QWidget() 
     self.setCentralWidget(self.centerWidget) 

     pushButton = QtGui.QPushButton("&Button") 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(pushButton) 
     self.centerWidget.setLayout(layout) 

     QtCore.QObject.connect(pushButton,QtCore.SIGNAL("clicked()"),self.showChildWindow)  

    def showChildWindow(self): 
     self.child_win = ChildWindow(self) 
     self.child_win.show() 


class ChildWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle("Child Window!") 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = MainWindow() 
    myapp.show() 
    sys.exit(app.exec_()) 
+1

你已經用第二個例子回答了你自己的問題,那麼問題是什麼? – ekhumoro 2014-10-28 18:14:19

+0

對於第一個示例,如何更改全局函數「showChildWindow」,以便它不會報告錯誤?謝謝。我想要用不同的方式來編寫它。 – user3718733 2014-10-30 05:39:36

+1

正如我在其他評論中所說的,第二個例子解決了這個問題。它保留對子窗口的引用,而第一個示例則允許主窗口(及其所有子窗口)在顯示後立即進行垃圾回收。那麼,爲什麼你不想用這個例子呢? – ekhumoro 2014-10-30 16:51:38

回答

0

真正的問題似乎是:如何從我的應用程序中的其他模塊訪問主窗口?

這個問題我首選的一般的解決辦法是子類的QApplication,並添加一個簡單的訪問方法,就像這樣:

class Application(QtGui.QApplication): 
    def __init__(self): 
     QtGui.QApplication.__init__(self, sys.argv) 
     self._window = None 

    def window(self): 
     if self._window is None: 
      self._window = MainWindow() 
     return self._window 

if __name__ == "__main__": 

    app = QtGui.qApp = Application() 
    app.window().show() 
    sys.exit(app.exec_()) 

有了到位,你可以很容易地訪問main-的方法窗口在這樣的其他模塊:

from PyQt4 import QtGui 

QtGui.qApp.window().showChildWindow() 
+0

我解決它如下。謝謝你們一樣。 DEF showChildWindow(個體): child_win = ChildWindow(個體) child_win.show() 如果__name__ == 「__main__」: 應用程式= QtGui.QApplication(sys.argv中) MYAPP =主窗口() myapp.show() QtCore.QObject.connect(myapp.pushButton,QtCore.SIGNAL(「clicked()」),lambda:showChildWindow(myapp)) sys.exit(app.exec_()) – user3718733 2014-11-01 00:28:01

0

我有同樣的問題。當與父窗口交互時,孩子QMainWindow會隨機消失。

這是導致此問題的壞源代碼:

def showChildWindow(self): 
    child_win = ChildWindow() 
    child_win.show() 

這是解決問題的好的源代碼:

def showChildWindow(self): 
    child_win = ChildWindow(self) 
    child_win.show() 

當你實例子窗口,請確保您通過父母的自我。