2017-08-10 108 views
0

我有一個多窗口的PyQt5(Python 3.6.2與Qt 5.9.0)應用程序,它可以在標準桌面(即窗口管理)環境中運行時完美工作。我的目標平臺是嵌入式設備(例如Raspberry Pi,i.MX6等),我不會使用X11窗口系統。我目前正在使用不支持多窗口的eglfs平臺測試嵌入式設備。我正在考慮使用QtWayland平臺,或者修改我的方法來使用QtStackedWidget將'windows'作爲單個頁面包含在堆棧中。使用QStackedWidget進行多窗口PyQt應用程序

如何修改下面的高級窗口應用程序以利用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不是特別難用。你有沒有嘗試過使用它?這一切都取決於你想要達到的目標,但總的來說,它應該都是可行的。你應該指定多頁面應用程序的含義。在單個窗口中實現多頁面應用程序的一種方法是使用QWizard。 – Trilarion

+0

我不知道QWizard,所以謝謝你指出。我發佈的示例代碼代表了我正在嘗試實現的基本多頁面配置,從而您在應用程序啓動時顯示了一個主頁面,其中包含多個導入的外部.py文件,這些文件顯示在主要窗口。我想仍然可以導入這些外部.py文件,但將它們嵌套在主窗口中。 – jars121

+0

我已經給出了一些更多想法,並以上面的示例代碼爲例進行了演示。我想我需要創建一個ui_Main.py文件,其中所有的setupUi都包含在所有'windows'中,然後有一個類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_())