2014-10-28 3 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

+0

Для первого примера, как изменить глобальный functon «showChildWindow», чтобы он не сообщал об ошибке? Спасибо. Я хочу получить другой способ написать его. – user3718733

+1

Как я уже сказал в своем другом комментарии, второй пример решает проблему. Он содержит ссылку на дочернее окно, в то время как первый пример позволяет отображать сборку главного окна (и всех его дочерних элементов) сразу же после его показа. Так почему бы вам не использовать пример, который работает? – ekhumoro

ответ

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

Я решаю это, как показано ниже. Все же разрешите поблагодарить вас. Защиту showChildWindow (Я): child_win = ChildWindow (само) child_win.show() если __name__ == "__main__": приложение = QtGui.QApplication (sys.argv) MyApp = MainWindow() myapp.show() QtCore.QObject.connect (myapp.pushButton, QtCore.SIGNAL ("clicked()"), lambda: showChildWindow (myapp)) sys.exit (app.exec_()) – user3718733

0

У меня была та же проблема. Ребенок QMainWindow будет случайно исчезать при взаимодействии с родительским окном.

Это плохой исходный код, который вызывает эту проблему:

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

Это хороший исходный код, который исправляет проблему:

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

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

Смежные вопросы