2016-10-02 125 views
3

到Python GUI編程一個新的窗口,我是新我更換現有的主窗口難以作出一個GUI應用程序。我有一個只有一個按鈕小部件的主窗口。我想知道的是如何在發生事件時(例如按下按鈕)用新窗口替換現有窗口。
的回答類似的問題在這裏Replace CentralWidget in MainWindow,建議使用QStackedWidgets但他們並沒有使用Qt Designer來使自己的GUI程序,而我有兩個.py文件,一個是主窗口文件,另一個窗口的,我想展示在按下按鈕後,因此我不知道如何在main.py文件中合併這兩個按鈕。 比如我的主窗口看起來是這樣的:
Main Window
並點擊按鈕後,就應更換這種現有的窗口:
New Window
我也想知道,如果第二個窗口應該是類型QStackedWindow的,QDialog或QWidget?
這裏是我的main.py代碼有使用Python,PyQt的,Qt設計

from PyQt4 import QtGui 
import sys 
import design, design1 
import os 

class ExampleApp(QtGui.QMainWindow, design.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ExampleApp, self).__init__(parent) 
     self.setupUi(self) 
     self.btnBrowse.clicked.connect(self.doSomething) 


    def doSomething(self): 
     # Code to replace the main window with a new window 
     pass 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = ExampleApp() 
    form.show() 
    app.exec_() 


if __name__ == '__main__': 
    main() 

回答

1

你可能不希望實際創建和刪除了一堆的窗口,但如果你真的想,你可以做這樣的

def doSomething(self): 
    # Code to replace the main window with a new window 
    window = OtherWindow() 
    window.show() 
    self.close() 

OtherWindow

class OtherWindow(...): 
    ... 
    def doSomething(self): 
     window = ExampleApp() 
     window.show() 
     self.close() 

你其實可能不希望這樣做。如果你只是簡單地創建了一個主窗口,使用QStackedWidget,並且將不同的控件和小部件放置在堆疊小部件的不同選項卡上,並在同一個窗口中切換它們,會更好。

1

可以使用QStackedWindow創建一個全新的窗口,並通過的onclick()事件HTEN它連接到主窗口。

button.clicked.connect(self.OtherWindow) 

否則你可以簡單地使用

class OtherWindow(self): 
    Owindow = OtherWindow() 
    Owindow.show() 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = ExampleApp() 
    form.show() 
    app.exec_() 


if __name__ == '__main__': 
    main() 
+0

爲什麼你會不會關閉其他窗口? –

1

下面是一個簡單的例子,你只需要使用自己的邏輯,但它表示你正在尋找一個簡單的方法。

您可以改用QWindow QWidgets,如果你願意的話,或者不同的佈局處置你的「對象」或什麼的。也許改變一下如何添加項目內部佈局,如果不是小部件...這樣的事情。 :)

from PyQt5.QtWidgets import QMainWindow 
from PyQt5.QtWidgets import QPushButton 
from PyQt5.QtWidgets import QStackedLayout 
from PyQt5.QtWidgets import QWidget, QApplication 

class MyWindow(QMainWindow): 

    front_wid = None 

    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     # MAIN WINDOW size 
     self.setFixedSize(200,200) 

     # CENTRAL WIDGET 
     self.central_wid = QWidget() 
     self.layout_for_wids = QStackedLayout() 

     # BUTTON TO SWITCH BETWEEN WIDGETS 
     self.btn_switch = QPushButton("Switch") 
     self.btn_switch.clicked.connect(self.switch_wids) 
     self.btn_switch.setFixedSize(50,50) 
     self.btn_switch 

     # 2 WIDGETS 
     self.wid1 = QWidget() 
     self.wid1.setStyleSheet("""background: blue;""") 
     self.wid1.setFixedSize(200,200) 
     self.wid1.move(100, 100) 
     self.wid2 = QWidget() 
     self.wid2.setStyleSheet("""background: green;""") 
     self.wid2.setFixedSize(200, 200) 
     self.wid2.move(100, 100) 

     # LAYOUT CONTAINER FOR WIDGETS AND BUTTON 
     self.layout_for_wids.addWidget(self.btn_switch) 
     self.layout_for_wids.addWidget(self.wid1) 
     self.layout_for_wids.addWidget(self.wid2) 

     # ENTERING LAYOUT 
     self.central_wid.setLayout(self.layout_for_wids) 

     # CHOOSE YOUR CENTRAL WIDGET 
     self.setCentralWidget(self.central_wid) 

     # WHICH WIDGET IS ON THE FRONT 
     self.front_wid = 1 

    def switch_wids(self): 

     # LOGIC TO SWITCH 
     if self.front_wid == 1: 
      self.wid1.hide() 
      self.wid2.show() 
      self.front_wid = 2 
     else: 
      self.wid1.show() 
      self.wid2.hide() 
      self.front_wid = 1 



if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    main = MyWindow() 
    main.resize(222, 222) 
    main.show() 

    sys.exit(app.exec_()) 

順便說這是PyQt5,如果你想使用PyQt4的,你必須改變這一切的進口。