我一直在尝试使用python3和Qt4从现有窗口调用新窗口。
我已经使用Qt Designer创建了两个窗口(主应用程序和另一个),并将Qt Designer生成的.ui文件转换为.py脚本-
但我似乎无法从主应用程序创建新窗口。
我尝试这样做:
############### MAIN APPLICATION SCRIPT ################
from PyQt4 import QtCore, QtGui
import v2
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(194, 101)
self.button1 = QtGui.QPushButton(Form)
self.button1.setGeometry(QtCore.QRect(50, 30, 99, 23))
self.button1.setObjectName(_fromUtf8("button1"))
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.button1.setText(QtGui.QApplication.translate("Form", "Ventana", None, QtGui.QApplication.UnicodeUTF8))
self.button1.connect(self.button1, QtCore.SIGNAL(_fromUtf8("clicked()")), self.mbutton1)
def mbutton1(self):
v2.main()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
################## SECOND WINDOW #######################
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.label = QtGui.QLabel(Form)
self.label.setGeometry(QtCore.QRect(160, 40, 57, 14))
self.label.setObjectName(_fromUtf8("label"))
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("Form", "LABEL 2", None, QtGui.QApplication.UnicodeUTF8))
def main():
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
但我收到此错误消息:
QCoreApplication::exec: The event loop is already running
QPixmap: Must construct a QApplication before a QPaintDevice
尽管pyuic
可以使用该-x, --execute
选项创建可执行脚本,但它主要用于测试。
的主要目的pyuic
是创建 静态 从Qt的Desgner Python模块ui
文件,让您 导入 包含的GUI类到应用程序中。
假设您已经ui
使用Qt Designer创建了两个文件,并将它们分别命名为v1.ui
和v2.ui
。
然后,您将像这样创建两个python模块:
pyuic4 -o v1.py v1.ui
pyuic4 -o v2.py v2.ui
接下来,您将编写一个单独的main.py
脚本,该脚本从模块中导入GUI类,并根据需要创建它们的实例。
因此,您main.py
可能看起来像这样:
from PyQt4 import QtGui
from v1 import Ui_Form1
from v2 import Ui_Form2
class Form1(QtGui.QWidget, Ui_Form1):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
self.button1.clicked.connect(self.handleButton)
self.window2 = None
def handleButton(self):
if self.window2 is None:
self.window2 = Form2(self)
self.window2.show()
class Form2(QtGui.QWidget, Ui_Form2):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Form1()
window.show()
sys.exit(app.exec_())
请注意,为了避免名称空间冲突,我对您的GUI类的名称进行了一些更改。为了给GUI类更好的名称,只需objectName
在Qt
Desgner中设置顶级类的属性即可。而且,pyuic
更改后,请不要忘记重新运行!