7

QT Designerを使用してPyQTで多くのGUIインターフェイスを作成しましたが、別のインターフェイスからインターフェイスを開こうとしています。その方法がわかりません 。Start.pyはGUIインターフェイスを実行するファイルです。 Authentification_1Acceuil_start.pyは、GUIインターフェイスAcceuil_2.pyを実行するファイルです。ここで、Start.pyからAcceuil_start.pyをランチします。あなたはそれについて何か考えがありますか?ありがとうございました。これが私のコードです:

Start.py:

import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow #???  Acceuil_2.py is the file which I want to open

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Fenetre_auth()
        self.ui.setupUi(self)

    def authentifier(val): #Slot method
        self.Acceuil = Acceuil() #???
        self.Acceuil.show() #???


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

Acceuil_start.py

import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())
4

2 に答える 2

3

まず、GUIクラスに名前を付けて、一般的な名前ではなく別の名前を付けて、区別できるようにする必要があります。

なぜあなたはそれをする必要があるのですか?ええと、単純に、それは理にかなっているので、すべてのクラスが異なるタイプのダイアログを表している場合、それは異なるタイプであり、異なる名前を付ける必要があります。名前の一部は、、、QMessageBoxなどAboutBoxですAddUserDialog

Acceuil_start.py内(他のモジュールでもクラスの名前を変更する必要があります)。

import sys
from PyQt4 import QtCore, QtGui
from Authentification_1 import Ui_Fenetre_auth
from Acceuil_2 import Ui_MainWindow

class Acceuil(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)


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

親クラスでは、ウィンドウを作成するときは閉じています(ただし、どのような場合でも機能するはずです)。

def authentifier(val): #Slot method
    self.Acceuil = Acceuil(self) # You should always pass the parent to the child control
    self.Acceuil.show() #???

親の問題について:ウィジェット/ウィンドウが別のウィジェットを作成している場合、作成者オブジェクトを親に設定することは常に良い考えです(いくつかの特異な場合を除いて)。これを読んで、その理由を確認する必要があります。

QObjectは、オブジェクトツリーに編成されます。別のオブジェクトを親としてQObjectを作成すると、そのオブジェクトは親のchildren()リストに追加され、親がそうである場合は削除されます。このアプローチは、GUIオブジェクトのニーズに非常によく適合していることがわかります。たとえば、QShortcut(キーボードショートカット)は関連するウィンドウの子であるため、ユーザーがそのウィンドウを閉じると、ショートカットも削除されます。

編集-最小限の作業サンプル

私があなたに伝えようとしていることを見るために、私は簡単な例を作成しました。2つのクラスがあります-MainWindowChildWindowQApplicationすべてのクラスは、個別のオブジェクトを作成することにより、他のクラスがなくても機能します。ただし、インポートChildWindowすると、5秒でトリガーされるシングルショットタイマーに接続されたスロットMainWindowに作成されます。ChildWindow

MainWindow.py:

import sys
from PyQt4 import QtCore, QtGui
from ChildWindow import ChildWindow

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        QtCore.QTimer.singleShot(5000, self.showChildWindow)


    def showChildWindow(self):
        self.child_win = ChildWindow(self)
        self.child_win.show()

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

ChildWindow.py:

import sys
from PyQt4 import QtCore, QtGui

class ChildWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setWindowTitle("Child Window!")


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = ChildWindow()
    myapp.show()
    sys.exit(app.exec_())
于 2013-02-07T16:55:28.090 に答える
0

Start.pyから他のダイアログを参照するには、モジュール名(この場合はAcceuil_start)をプレフィックスとして付ける必要があります。そのため、各モジュールに重複する関数名があっても問題ありません。だから、あなたは持っているでしょう:

def authentifier(val): #Slot method
    dlg = Acceuil_start.StartQT4()
    dlg.exec_()

appただし、これらを同じプロセスから実行する場合は、2つのオブジェクトを使用できないことに注意してください。メインウィンドウではなく、ダイアログのように機能するようにAcceuil_start.pyを構成することをお勧めします。これらが2つの異なるメインウィンドウである場合は、Acceuil_start.pyをパラメーターとして使用して別のPythonインタープリターを呼び出す方が簡単な場合があります。

于 2013-02-07T17:11:16.420 に答える