7

私はPySideに少し慣れていません。一度に1つのウィジェットを表示するメインウィンドウオブジェクトがあります。QMainWindowボタンを押したときにウィンドウに表示されているウィジェットを置き換えるために、クラスの中央ウィジェットを変更しようとしています。問題は、押されたボタンがメインウィンドウクラスではなく、Widgetクラスにあることです。

いう...

class App(QtGui.QMainWindow):

    def __init__(self):
        super(App, self).__init__()

        self.initUI()

    def initUI(self):

        self.statusBar().showMessage('Listo.') #Status Bar
        self.login_screen = LoginScreen()
        self.logged_in_screen = LoggedInScreen()

        self.setCentralWidget(self.login_screen)

        self.setGeometry(300, 300, 450, 600) #Window Size
        self.setWindowTitle('PyTransactio - Client') #Window Title
        self.setWindowIcon(QtGui.QIcon('icon.png')) #App Icon
        self.show()

押されたボタンはlogin_screenインスタンス内にあります。ボタンがクリックされたときに呼び出されるメソッドは、LoginScreenクラス内にあります。

def login(self):
        """ Send login data to the server in order to log in """

        #Process

        self.setParent(None)

親ウィジェットを設定すると、メインウィンドウからNoneウィジェット()が削除されます。(ウィジェット内)が押されたときにメインウィンドウの中央ウィジェットとしてlogin_screen別のウィジェット(例)を取得するにはどうすればよいですか?logged_in_screenloginButtonlogin_screen

たぶん、ログインメソッドはメインウィンドウクラス内にあるべきですか?もしそうなら、どのように私login_screenはメインウィンドウの方法で押されたボタンを接続することができますか?

4

2 に答える 2

17

を中央ウィジェットとして使用しQStackedWidget、ログイン画面と「ログイン済み」画面の両方をウィジェットに追加できます。

使用例:

from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.central_widget = QtGui.QStackedWidget()
        self.setCentralWidget(self.central_widget)
        login_widget = LoginWidget(self)
        login_widget.button.clicked.connect(self.login)
        self.central_widget.addWidget(login_widget)
    def login(self):
        logged_in_widget = LoggedWidget(self)
        self.central_widget.addWidget(logged_in_widget)
        self.central_widget.setCurrentWidget(logged_in_widget)


class LoginWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(LoginWidget, self).__init__(parent)
        layout = QtGui.QHBoxLayout()
        self.button = QtGui.QPushButton('Login')
        layout.addWidget(self.button)
        self.setLayout(layout)
        # you might want to do self.button.click.connect(self.parent().login) here


class LoggedWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(LoggedWidget, self).__init__(parent)
        layout = QtGui.QHBoxLayout()
        self.label = QtGui.QLabel('logged in!')
        layout.addWidget(self.label)
        self.setLayout(layout)



if __name__ == '__main__':
    app = QtGui.QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

このウィジェットを使用したくない場合はQMainWindow.setCentralWidget、中央のウィジェットを変更するたびに呼び出す必要があると思います。

メソッドがどこにあるloginべきかについては、それによって異なります。おそらく、メインウィンドウが特定の中央ウィジェットを追加/削除/表示するための単純なインターフェイスを定義しloginLoginScreen. このように、LoginScreenクラスは、中央のウィジェットが実際に であるか、またはこれが別の方法で行われているかなど、実装の詳細を知る必要はありませんQStackedWidget

于 2012-11-25T12:30:48.220 に答える
-3

QMainWindow.setCentralWidget を使用してこれを (繰り返し) 行うことができます。

#! /usr/bin/env python3

from PySide import QtGui
from PySide import QtCore

import sys 

app = QtGui.QApplication(sys.argv)
mw = QtGui.QMainWindow()
w2 = QtGui.QWidget()
pb = QtGui.QPushButton('push me', w2) 

l1 = QtGui.QLabel('orig')
l2 = QtGui.QLabel('changed')
mw.setCentralWidget(l1)
pb.clicked.connect(lambda: mw.setCentralWidget(l2))
mw.show()
w2.show()
sys.exit(app.exec_())
于 2012-11-30T19:53:50.430 に答える