显示没有MainWindow

时间:2015-11-05 09:10:19

标签: python pyqt qwidget

我在显示QWidget窗口时遇到问题,供用户输入一些数据。

我的脚本没有GUI,但我只想显示这个小的QWidget窗口。

我用QtDesigner创建了窗口,现在我试图像这样显示QWidget窗口:

from PyQt4 import QtGui
from input_data_window import Ui_Form

class childInputData(QtGui.QWidget ):

    def __init__(self, parent=None):
        super(childInputData, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.setFocus(True)
        self.show()

然后,从我的主要课程来看,我这样做:

class myMainClass():

    childWindow = childInputData()

这给了我错误:

QWidget: Must construct a QApplication before a QPaintDevice

所以现在我正在做,从我的主要班级:

class myMainClass():

    app = QtGui.QApplication(sys.argv)
    childWindow = childInputData() 

现在没有错误,但是窗口显示两次,脚本不会等到输入数据,它只显示窗口并继续而不等待。

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

显示窗口并且脚本继续运行是完全正常的:您从未告诉脚本等待用户回答。你只是告诉它显示一个窗口。

您希望脚本在用户完成并关闭窗口之前停止。

以下是一种方法:

from PyQt4 import QtGui,QtCore
import sys

class childInputData(QtGui.QWidget):

    def __init__(self, parent=None):
        super(childInputData, self).__init__()
        self.show()

class mainClass():

    def __init__(self):
        app=QtGui.QApplication(sys.argv)
        win=childInputData()
        print("this will print even if the window is not closed")
        app.exec_()
        print("this will be print after the window is closed")

if __name__ == "__main__":
    m=mainClass()

exec()方法"进入主事件循环并等待直到调用exit()" (doc):
该行将在app.exec_()行被阻止,直到该窗口关闭。

注意:使用sys.exit(app.exec_())会导致脚本在窗口关闭时结束。

另一种方法是使用QDialog代替QWidget。然后,您将self.show()替换为self.exec(),这将阻止脚本

来自doc

  

int QDialog :: exec()

     

将对话框显示为模式对话框,在用户关闭之前将其阻止

最后,相关问题的this answer提倡不使用exec,而是使用win.setWindowModality(QtCore.Qt.ApplicationModal)设置窗口模态。但是这不起作用:它阻止其他窗口中的输入,但不阻止脚本。

答案 1 :(得分:0)

你不需要myMainClass ......做这样的事情:

import sys
from PyQt4 import QtGui
from input_data_window import Ui_Form

class childInputData(QtGui.QWidget):
  def __init__(self, parent=None):
    super(childInputData, self).__init__(parent)
    self.ui = Ui_Form()
    self.ui.setupUi(self)
    self.setFocus(True)

if __name__ == "__main__":
 app = QtGui.QApplication(sys.argv)
 win = childInputData()
 win.show()
 sys.exit(app.exec_())