2016-12-20 2 views
1

J'ai deux boutons (wgtbtnA & wgtbtnB) placés sur deux pages différentes (de page1 et page2, respectivement) à l'intérieur d'un objet parent (OBJECTNAME: stackedWidget). Mon dilemme est le suivant: lorsque je lance le code, les flèches ne s'affichent pas dans PyQt. Pourquoi? Comment puis-je alterner de la page1 à la page2 et vice-versa?PyQt: Comment passer des widgets dans QStackedWidget

est ici une image d'exécution, qui traduit ce que je vous demande:

btnwgtB

Qt Designer:

btnwgtA

Je voudrais garder ces petites flèches arrière .

Ci-dessous mon code:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'stackedWidget.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 
import sys 
import os 


try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(512, 304) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.stackedWidget = QtGui.QStackedWidget(self.centralwidget) 
     self.stackedWidget.setGeometry(QtCore.QRect(150, 60, 161, 121)) 
     self.stackedWidget.setObjectName(_fromUtf8("stackedWidget")) 
     self.page = QtGui.QWidget() 
     self.page.setObjectName(_fromUtf8("page")) 
     self.wgtMainWindow = QtGui.QPushButton(self.page) 
     self.wgtMainWindow.setGeometry(QtCore.QRect(50, 50, 75, 23)) 
     self.wgtMainWindow.setObjectName(_fromUtf8("wgtMainWindow")) 
     self.stackedWidget.addWidget(self.page) 
     self.page_2 = QtGui.QWidget() 
     self.page_2.setObjectName(_fromUtf8("page_2")) 
     self.wgtbtnB = QtGui.QPushButton(self.page_2) 
     self.wgtbtnB.setGeometry(QtCore.QRect(50, 50, 75, 23)) 
     self.wgtbtnB.setObjectName(_fromUtf8("wgtbtnB")) 
     self.stackedWidget.addWidget(self.page_2) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 512, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     self.stackedWidget.setCurrentIndex(1) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.wgtMainWindow.setText(_translate("MainWindow", "Widget A", None)) 
     self.wgtbtnB.setText(_translate("MainWindow", "Widget B", None)) 


class ControlMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(ControlMainWindow, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mySW = ControlMainWindow() 
    mySW.show() 
    sys.exit(app.exec_()) 

Répondre

0

vous n'avez pas logique dans votre ControlMainWindow classe pour basculer entre vos widgets. (Aussi je ne vois pas de widgets flèche pour la commutation), vous devez ajouter un écouteur à votre QTbuttons dans votre classe principale comme ci-dessous pour exécuter votre logique:

yourQTbutton.itemClicked.connect(self.functioWithUIchangingLogic) 
+0

Désolé. J'aurais dû être plus précis. Je sais comment connecter les signaux et les slots. Mon problème est, où vont les flèches pyqt auto-formatées. Généralement, il y a deux flèches noires dans le coin supérieur droit des widgets empilés. –

+0

Utilisez-vous le concepteur QT pour créer l'interface utilisateur? Si c'est le cas, les deux flèches que vous voyez dans le concepteur ne se reportent pas à votre application, c'est une fonction dans le concepteur de sorte que vous pouvez passer facilement entre eux – ECM

+0

Got it. Donc, il n'y a aucun moyen de les reporter par programme, correct? –

0

les deux flèches que vous voyez dans le concepteur (dans votre message ci-dessous) ne sont pas retenus à votre application, sa fonction dans le concepteur de sorte que vous pouvez facilement basculer entre les

+0

@ekhumoro: Que faire si vous êtes limité par le montant que vous pouvez ajouter. Il ne me laisserait pas ajouter plus de 2 images dans mon message original en raison du fait que je suis nouveau. Ne pas essayer d'être disputatoire; Cependant, il est difficile de fournir la spécificité et la clarté, quand vous êtes limité dans ce que vous pouvez ajouter pour prouver ce point. Ergo, je m'excuse pour ma nescience. Peut-être, vous avez une solution alternative pour ces cas? Si oui, j'aimerais entendre.Cordialement, Jeremy –

+0

@JeremyStiefel. Modifiez votre question de toute façon: quelqu'un avec le représentant nécessaire peut réparer les liens plus tard. Vous n'êtes limité que dans ce que vous pouvez faire parce que vous n'avez pas assez de rep: la solution simple est de simplement [obtenir plus de rep] (https://stackoverflow.com/help/whats-reputation). – ekhumoro

1

vous pouvez utiliser les boutons pour modifier la page: {your QPushButton}.clicked.connect(lambda: {your QStackedWidget}.setCurrentIndex({another page}))

Par exemple:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'stackedWidget.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 
import sys 


try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(512, 304) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.stackedWidget = QtGui.QStackedWidget(self.centralwidget) 
     self.stackedWidget.setGeometry(QtCore.QRect(150, 60, 161, 121)) 
     self.stackedWidget.setObjectName(_fromUtf8("stackedWidget")) 
     self.page = QtGui.QWidget() 
     self.page.setObjectName(_fromUtf8("page")) 
     self.wgtMainWindow = QtGui.QPushButton(self.page) 
     self.wgtMainWindow.setGeometry(QtCore.QRect(50, 50, 75, 23)) 
     self.wgtMainWindow.setObjectName(_fromUtf8("wgtMainWindow")) 
     self.stackedWidget.addWidget(self.page) 
     self.page_2 = QtGui.QWidget() 
     self.page_2.setObjectName(_fromUtf8("page_2")) 
     self.wgtbtnB = QtGui.QPushButton(self.page_2) 
     self.wgtbtnB.setGeometry(QtCore.QRect(50, 50, 75, 23)) 
     self.wgtbtnB.setObjectName(_fromUtf8("wgtbtnB")) 
     self.stackedWidget.addWidget(self.page_2) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 512, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     self.stackedWidget.setCurrentIndex(1) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.wgtMainWindow.setText(_translate("MainWindow", "Widget A", None)) 
     self.wgtbtnB.setText(_translate("MainWindow", "Widget B", None)) 


class ControlMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(ControlMainWindow, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.ui.wgtbtnB.clicked.connect(lambda : self.ui.stackedWidget.setCurrentIndex(0)) 
     self.ui.wgtMainWindow.clicked.connect(lambda : self.ui.stackedWidget.setCurrentIndex(1)) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mySW = ControlMainWindow() 
    mySW.show() 
    sys.exit(app.exec_()) 

application Début:

enter image description here

après bouton cliqué:

enter image description here

après un autre bouton cliqué:

enter image description here