6

python3とQt4を使用して、既存のウィンドウから新しいウィンドウを呼び出そうとしています。

Qt Designerを使用して2つのウィンドウ(メインアプリケーションともう1つ)を作成し、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
4

2 に答える 2

12

pyuicオプションで実行可能なスクリプトを作成できますが-x, --execute、主にテスト用です。

の主な目的は、含まれている GUI クラスをアプリケーションにインポートできるようにするQt Desgnerファイルから静的pyuicpython モジュールを作成することです。ui

uiQt Designer を使用して2 つのファイルを作成し、それらに and という名前を付けたv1.uiとしv2.uiます。

次に、次のように 2 つの 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変更を行った後は、再実行することを忘れないでください。

于 2012-11-22T19:47:56.983 に答える
5

作成できるのは 1 つだけQApplicationです。作成したら、必要な数のウィンドウを作成できます。

例えば:

from PyQt4 import QtGui, QtCore

class MyWindow(QtGui.QDialog):    # any super class is okay
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.button = QtGui.QPushButton('Press')
        layout = QtGui.QHBoxLayout()
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.button.clicked.connect(self.create_child)
    def create_child(self):
        # here put the code that creates the new window and shows it.
        child = MyWindow(self)
        child.show()


if __name__ == '__main__':
    # QApplication created only here.
    app = QtGui.QApplication([])
    window = MyWindow()
    window.show()
    app.exec_()

ボタンをクリックするたびに、新しいウィンドウが作成されます。

Designer で作成したウィンドウを使用するように上記の例を変更できます。

余談ですが:

pyuic の結果を決して編集しないでください。これらのファイルは変更しないでください。mbutton1これは、メソッドを に追加しないことを意味しUi_Formます。

mywindow_ui.pypyuic によって作成されたファイルがある場合は、ファイルを作成して次のmywindow.pyように配置します。

from PyQt4 import QtCore, QtGui
from mywindow_ui import Ui_MyWindow

class MyWindow(QtGui.QWidget, Ui_MyWindow):   #or whatever Q*class it is
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)
    def create_child(self):   #here should go your mbutton1
        # stuff
#etc.

メインファイルから次のmain.pyことを行います。

from PyQt4 import QtGui

from mywindow import MyWindow


# ...

if __name__ == '__main__':
    app = QtGui.QApplication([])
    window = MyWindow()
    window.show()
    app.exec_()
于 2012-11-22T17:47:58.340 に答える