2016-08-25 3 views
2

Je fais un programme avec une interface graphique utilisant PyQt5. Je veux faire est que lorsque l'utilisateur appuie sur un certain bouton, cela change le widget et montre d'autres options. Pour cela, j'ai décidé d'utiliser QStackedWidget, et toute mon interface le construit à partir du concepteur QT5. Cependant, dans mon code, voulant déterminer que mon bouton de nom "btfr" m'indique "page_2" de mon stackedWidget lorsqu'il est pressé, en utilisant la méthode QStackedWidget.setCurrentIndex, cela ne fait rien ou fait une erreur."QStackedWidget.setCurrentIndex": Cela ne fonctionne pas ou marque d'erreur

le code est le suivant:

import sys 
from PyQt5 import uic 
from PyQt5.QtCore import QTimeLine 
from PyQt5.QtWidgets import * 
from PyQt5.QtGui import * 

infz = uic.loadUiType("main.ui")[0] 


class FaderWidget(QWidget): 

    def __init__(self, old_widget, new_widget): 

     QWidget.__init__(self, new_widget) 

     self.old_pixmap = QPixmap(new_widget.size()) 
     old_widget.render(self.old_pixmap) 
     self.pixmap_opacity = 1.0 
     self.timeline = QTimeLine() 
     self.timeline.valueChanged.connect(self.animate) 
     self.timeline.finished.connect(self.close) 
     self.timeline.setDuration(333) 
     self.timeline.start() 
     self.resize(new_widget.size()) 
     self.show() 

    def paintEvent(self, event): 

     painter = QPainter() 
     painter.begin(self) 
     painter.setOpacity(self.pixmap_opacity) 
     painter.drawPixmap(0, 0, self.old_pixmap) 
     painter.end() 

    def animate(self, value): 

     self.pixmap_opacity = 1.0 - value 
     self.repaint() 

class StackedWidget(QStackedWidget): 

    def __init__(self, parent=None): 
     QStackedWidget.__init__(self, parent) 

    def setCurrentIndex(self, index): 
     self.stack = MyWindowClass() 
     self.a = self.stack.stackedWidget.currentWidget() 
     self.b = self.stack.stackedWidget.widget(index) 
     self.fader_widget = FaderWidget(self.a, self.b) 
     QStackedWidget.setCurrentIndex(self, index) 
     print(self, index) 

    def setPage1(self): 
     self.setCurrentIndex(0) 

    def setPage2(self): 
     self.setCurrentIndex(1) 


class MyWindowClass(QStackedWidget, infz): 
    def __init__(self, parent=None): 
     global pos, c, f 
     self.pos = 0 
     self.c = [] 
     self.f = False 
     QStackedWidget.__init__(self, parent) 
     self.setupUi(self) 
     self.setWindowTitle('SkR') 

if __name__ == "__main__": 

    app = QApplication(sys.argv) 

    window = MyWindowClass() 
    window.resize(788, 518) 
    stack = StackedWidget() 
    window.btfr.clicked.connect(stack.setPage2) 
    window.btnpx.clicked.connect(stack.setPage1) 
    window.show() 

    sys.exit(app.exec_()) 

Ce que je veux avec ce code est que le changement widget fait avec un effet: « fade out ».

Si j'imprimer le « moi » et l ' « indice » recevant QStackedWidget.setCurrentIndex montre les éléments suivants:

<__main__.StackedWidget object at 0x7fc2eb6b5c18> 0 

Le numéro zéro est index, et l'autre élément est auto

Nous vous remercions de votre attention, j'espère que quelqu'un peut vous aider.

Répondre

0

Votre question est pas tout à fait claire, mais ne vous voulez juste:

def setIndex(self, index): 
    self.setCurrentIndex(index) 

Cependant, ceci est un peu redondant que vous devriez pouvoir relier le bouton directement à la méthode setCurrentIndex et utiliser lambda pour transmettre la valeur d'index:

btfr.clicked.connect(lambda: self.setCurrentIndex(2)) 
+0

Désolé d'être quelque peu incomplète ma question, je l'ai mis à jour, je l'espère, vous pouvez me aider. Merci beaucoup. –