2016-10-02 8 views
3

Python GUIプログラミングの新機能私はGUIアプリケーションの作成に問題があります。私はそれにボタンウィジェットだけのメインウィンドウを持っています。私が知りたいことは、イベントが発生したとき(ボタンクリックなど)、既存のウィンドウを新しいウィンドウに置き換える方法です。
類似の質問への回答Replace CentralWidget in MainWindow QStackedWidgetsの使用を提案していますが、Qt Designerを使用してGUIアプリケーションを作成するのではなく、2つの.pyファイルがあり、1つはメインウィンドウファイルで、もう1つは表示したいウィンドウですボタンを押した後に、私はmain.pyファイルでこれらの2つをどのように組み合わせるのか分かりません。 は、例えば私のメインウィンドウには、次のようになります。
Main Window
ボタンをクリックした後、それはこれで既存のウィンドウ置き換える必要があります。
New Window
を私はまた、第二のウィンドウがタイプQStackedWindowであるべきかどうかを知りたいです、QDialogまたはQWidget?
は、ここに私のmain.pyコードPython、PyQt、Qt Designerで既存のMainWindowを新しいウィンドウに置き換える

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つのメインウィンドウを作成し、異なるコントロールとウィジェットをスタックウィジェットの異なるタブに配置し、同じウィンドウ内でそれらのスイッチを切り替えるだけであれば、はるかに良いでしょう。

1

QStackedWindowを使用すると、新しいウィンドウ全体を作成し、それをonclick()イベントを通じてメインウィンドウに接続することができます。

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

を使用することができます簡単な例である、あなたは自分自身のロジスティックを使用する必要がありますが、それはあなたが探しているものを表現するための簡単な方法です。

QWidgetsの代わりにQWindowを使用して、「オブジェクト」などを配置するために好みのレイアウトや異なるレイアウトを使用できます。たぶん、レイアウトの中に項目を追加する方法をちょっと変えるかもしれません。あなたがPyQt4を使用したい場合:)

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だところで、あなたはすべての輸入を変更する必要があります。

関連する問題