显示不带主窗口的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() 

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

这里怎么了?

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

您希望脚本停止,直到用户完成操作并关闭窗口。

这里有一种方法:

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):
脚本将在CCD_ 2线上被阻止,直到窗口被关闭。

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


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

来自文档:

int QDialog::exec()

将对话框显示为模式对话框,阻止直到用户关闭


最后,这个相关问题的答案主张不使用exec,而是使用win.setWindowModality(QtCore.Qt.ApplicationModal)设置窗口模态。然而,这在这里不起作用:它会阻止其他窗口中的输入,但不会阻止脚本。

您不需要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_())

最新更新