2017-01-22 71 views
0

我發現了一個很好的例子,說明如何在兩個小部件之間進行淡入淡出。現在,我在這裏要做的是將我在自己的類中構建的每個小部件進行拆分。與這個階段的代碼的問題是在編輯器:類,行:AttributeError:'FaderWidget'對象沒有屬性'pixmap_opacity'

self.buttonBox.rejected.connect(stack.setPage1) 

當我點擊「取消」按鈕,它給了我這些結果:

# Result: Traceback (most recent call last): 
File "<string>", line 28, in paintEvent 
AttributeError: 'FaderWidget' object has no attribute 'pixmap_opacity' 

它是某種父母的錯誤?

謝謝

代碼:

import sys 
from PySide.QtCore import QTimeLine 
from PySide.QtGui import * 

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.fader_widget = FaderWidget(self.currentWidget(), self.widget(index)) 
     QStackedWidget.setCurrentIndex(self, index) 

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

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

    def setPage3(self): 
     self.setCurrentIndex(2) 

    def setPage4(self): 
     self.setCurrentIndex(3) 


class editor_(QWidget): 
    """build a text editor""" 
    def __init__(self): 
     super(editor_, self).__init__() 

     editor = QTextEdit() 
     editor.setPlainText("Kawabungaaaa! "*100) 

     self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) 

     self.buttonBox.accepted.connect(self.close) 
     self.buttonBox.rejected.connect(stack.setPage1) 

     layout = QVBoxLayout() 
     layout.addWidget(editor) 
     layout.addWidget(self.buttonBox) 

     self.setLayout(layout) 


class mainWidget(QWidget): 
    def __init__(self): 
     super(mainWidget, self).__init__() 

     self.setMinimumSize(500,300)   

     widget1 = QWidget() 
     widget2 = QCalendarWidget() 
     widget3 = QListView() 
     widget4 = editor_() 

     grid = QGridLayout() 

     allPlates = QPushButton("Calendar") 
     singlePlate = QPushButton("ListView") 
     allRoto = QPushButton("Editor") 
     allLighting = QPushButton("Buttons") 

     grid.addWidget(allPlates,0,0) 
     grid.addWidget(singlePlate,0,1) 
     grid.addWidget(allRoto,1,0) 
     grid.addWidget(allLighting,1,1) 

     widget1.setLayout(grid) 

     stack = StackedWidget() 
     stack.addWidget(widget1) 
     stack.addWidget(widget2) 
     stack.addWidget(widget3) 
     stack.addWidget(widget4) 

     layout = QHBoxLayout() 
     layout.addWidget(stack) 
     self.setLayout(layout) 

     allPlates.clicked.connect(stack.setPage2) 
     singlePlate.clicked.connect(stack.setPage3) 
     allRoto.clicked.connect(stack.setPage4) 
     allLighting.clicked.connect(stack.setPage1) 


a = mainWidget() 
a.show() 

回答

0

不能使用的資源,但這不是當前的環境中。 在你的情況,堆棧沒有在editor_類中定義,所以它會產生一個錯誤。爲了解決這個問題,必須在創建後,他們和他們有共同興趣的領域連接,你的情況mainWidget

.... 
stack.addWidget(widget4) 
widget4.buttonBox.rejected.connect(stack.setPage1) 
... 

完整代碼:

import sys 

from PySide.QtCore import QTimeLine 
from PySide.QtGui import * 


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.fader_widget = FaderWidget(self.currentWidget(), self.widget(index)) 
     QStackedWidget.setCurrentIndex(self, index) 

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

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

    def setPage3(self): 
     self.setCurrentIndex(2) 

    def setPage4(self): 
     self.setCurrentIndex(3) 


class editor_(QWidget): 
    """build a text editor""" 

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

     editor = QTextEdit() 
     editor.setPlainText("Kawabungaaaa! " * 100) 

     self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) 
     self.buttonBox.accepted.connect(self.close) 

     layout = QVBoxLayout() 
     layout.addWidget(editor) 
     layout.addWidget(self.buttonBox) 

     self.setLayout(layout) 


class mainWidget(QWidget): 
    def __init__(self): 
     super(mainWidget, self).__init__() 

     self.setMinimumSize(500, 300) 

     widget1 = QWidget() 
     widget2 = QCalendarWidget() 
     widget3 = QListView() 
     widget4 = editor_() 

     grid = QGridLayout() 

     allPlates = QPushButton("Calendar") 
     singlePlate = QPushButton("ListView") 
     allRoto = QPushButton("Editor") 
     allLighting = QPushButton("Buttons") 

     grid.addWidget(allPlates, 0, 0) 
     grid.addWidget(singlePlate, 0, 1) 
     grid.addWidget(allRoto, 1, 0) 
     grid.addWidget(allLighting, 1, 1) 

     widget1.setLayout(grid) 

     stack = StackedWidget() 
     stack.addWidget(widget1) 
     stack.addWidget(widget2) 
     stack.addWidget(widget3) 
     stack.addWidget(widget4) 

     widget4.buttonBox.rejected.connect(stack.setPage1) 

     layout = QHBoxLayout() 
     layout.addWidget(stack) 
     self.setLayout(layout) 

     allPlates.clicked.connect(stack.setPage2) 
     singlePlate.clicked.connect(stack.setPage3) 
     allRoto.clicked.connect(stack.setPage4) 
     allLighting.clicked.connect(stack.setPage1) 


app = QApplication(sys.argv) 
a = mainWidget() 
a.show() 
sys.exit(app.exec_()) 
+0

真棒!非常感謝!我知道這裏的人真的很容易。 –