2017-08-10 27 views
0

標準のデスクトップ(つまりウィンドウ管理)環境で動作するときに完全に動作するマルチウィンドウPyQt5(Python 3.6.2 with Qt 5.9.0)アプリケーションがあります。ターゲットプラットフォームは、X11ウィンドウシステムを使用しない埋め込み型デバイス(Raspberry Pi、i.MX6など)です。私は現在、複数のウィンドウをサポートしていないeglfsプラットフォームで組み込みデバイスをテストしています。私はQtWaylandプラットフォームを使用するか、QtStackedWidgetを使用してスタック内の個々のページとして 'windows'を格納する方法を変更しています。マルチウィンドウPyQtアプリケーションにQStackedWidgetを使用

以下の高レベルウィンドウアプリケーションを変更して、QStackedWidgetの配置を活用して、ウィンドウレス環境でマルチページアプリケーションを容易にする方法はありますか?

from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtWidgets import QApplication, QMainWindow 

from ui_Main import Ui_Main 
from ui_Window1 import Ui_Window1 
from ui_Window2 import Ui_Window2 

class Main(QMainWindow, Ui_Main): 
    def __init__(self, parent=None): 
     super(Main, self).__init__(parent) 
     self.setupUi(self) 

     #Initialisation functions 

     self.PushButton1.clicked.connect(self.OpenWindow1) 
     self.PushButton2.clicked.connect(self.OpenWindow2) 

    def OpenWindow1(self): 
     showWindow1.show() 

    def OpenWindow2(self): 
     showWindow2.show() 

class Window1(QMainWindow, Ui_Window1): 
    def __init__(self, parent=None): 
     super(Window1, self).__init__(parent) 
     self.setupUi(self) 

class Window2(QMainWindow, Ui_Window2): 
    def __init__(self, parent=None): 
     super(Window2, self).__init__(parent) 
     self.setupUi(self) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    showMain = Main() 
    showWindow1 = Window1() 
    showWindow2 = Window2() 
    showMain.show() 

    app.exec_() 
+0

eglfsプラットフォームに精通していないが、QStackedWidgetを使用することが特に難しいことではありません。ちょうどそれを使用しようとしましたか?それはすべてあなたが達成しようとしているものに依存しますが、一般的にはすべて実行可能でなければなりません。マルチページアプリケーションが意味するものを指定する必要があります。 1つのウィンドウ内でマルチページアプリケーションを実装する1つの方法は、QWizardを使用することです。 – Trilarion

+0

私はQWizardを知らなかったので、それを指摘してくれてありがとう。私が投稿したサンプルコードは、私が達成しようとしている基本的なマルチページ構成を表しています。これにより、アプリケーションの開始時に表示されるメインページと、メインの上に表示される複数のインポートされた外部.pyファイル窓。私はこれらの外部の.pyファイルをインポートすることができるようにしたいと思いますが、それらをメインウィンドウ内にネストします。 – jars121

+0

これをもう少し考えてみましたが、上記のサンプルコードを例として取り上げました。私は、すべての 'windows'に対してすべてのsetupUiが含まれている単一のui_Main.pyファイルを作成し、次に単一のクラスMain()を作成する必要があると思います。 – jars121

答えて

0

私は、単一のページ内の「窓」のそれぞれの巣にQStackedLayoutを使用して、単一の外部ファイルに外部の.pyファイルのsetupUI()各機能を統合しました。以下のファイルは、私の質問に掲示されているサンプルのマルチウィンドウの例を使って、このアプローチを反映しています。

ui_Main.py:

from PyQt5 import QtCore, QtGui, QtWidgets 

import sys 

class Ui_Main(QtWidgets.QWidget): 
    def setupUi(self, Main): 
     Main.setObjectName("Main") 
     Main.resize(800, 480) 

     self.QtStack = QtWidgets.QStackedLayout() 

     self.stack1 = QtWidgets.QWidget() 
     self.stack2 = QtWidgets.QWidget() 
     self.stack3 = QtWidgets.QWidget() 

     self.Window1UI() 
     self.Window2UI() 
     self.Window3UI() 

     self.QtStack.addWidget(self.stack1) 
     self.QtStack.addWidget(self.stack2) 
     self.QtStack.addWidget(self.stack3) 

    def Window1UI(self): 
     self.stack1.resize(800, 480) 

     #PushButton1# 
     self.PushButton1 = QtWidgets.QPushButton(self.stack1) 
     self.PushButton1.setText("BUTTON 1") 
     self.PushButton1.setGeometry(QtCore.QRect(10, 10, 100, 100)) 

     #PushButton2# 
     self.PushButton2 = QtWidgets.QPushButton(self.stack1) 
     self.PushButton2.setText("BUTTON 2") 
     self.PushButton2.setGeometry(QtCore.QRect(150, 150, 100, 100)) 

    def Window2UI(self): 
     self.stack2.resize(800, 480) 
     self.stack2.setStyleSheet("background: red") 

    def Window3UI(self): 
     self.stack3.resize(800, 480) 
     self.stack3.setStyleSheet("background: blue") 

Main.py:

from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtWidgets import QApplication, QMainWindow 

import sys 

from ui_Main import Ui_Main 

class Main(QMainWindow, Ui_Main): 
    def __init__(self, parent=None): 
     super(Main, self).__init__(parent) 
     self.setupUi(self) 

     self.PushButton1.clicked.connect(self.OpenWindow1) 
     self.PushButton2.clicked.connect(self.OpenWindow2) 

    def OpenWindow1(self): 
     self.QtStack.setCurrentIndex(1) 

    def OpenWindow2(self): 
     self.QtStack.setCurrentIndex(2) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    showMain = Main() 
    sys.exit(app.exec_()) 
関連する問題