2014-10-28 65 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() 

当你实例子窗口,请确保您通过父母的自我。