我在为用户显示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_())