2017-11-30 5 views
0

2つのタブを含むページがあります.iタブを変更するとフェードイン効果を追加しますか?pyqtでのタブのフェーディング

import sys 
from PyQt4.QtCore import QTimeLine 
from PyQt4.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) 


if __name__ == "__main__": 

    app = QApplication(sys.argv) 

    window = QWidget() 

    stack = StackedWidget() 
    stack.addWidget(QCalendarWidget()) 
    editor = QTextEdit() 
    editor.setPlainText("Hello world! "*100) 
    stack.addWidget(editor) 

    page1Button = QPushButton("Page 1") 
    page2Button = QPushButton("Page 2") 
    page1Button.clicked.connect(stack.setPage1) 
    page2Button.clicked.connect(stack.setPage2) 

    layout = QGridLayout(window) 
    layout.addWidget(stack, 0, 0, 1, 2) 
    layout.addWidget(page1Button, 1, 0) 
    layout.addWidget(page2Button, 1, 1) 

    window.show() 

    sys.exit(app.exec_()) 

これは、いくつかのフェード効果を示しているが、私はそれから何を取得していないし、それがどのように動作し、どのようにタブを実装するには、mコードです。誰かがタブ上に実装するのを手助けできるのであれば、本当に感謝しています。ありがとうございます。

答えて

1

あなたが表示するコードと同じロジックで、各ウィジェットはQStackedWidgetの中に配置されます。そのうちの1つは表示されるウィジェットとなり、もう1つはFaderWidgetになります。

class FaderWidget(QWidget): 
    def __init__(self, *args, **kwargs): 
     QWidget.__init__(self, *args, **kwargs) 
     self.pixmap_opacity = None 
     self.timeline = QTimeLine(333, self) 
     self.timeline.valueChanged.connect(self.animate) 
     self.timeline.finished.connect(self.close) 

    def start(self, old_widget, new_widget): 
     self.pixmap_opacity = 1.0 
     self.old_pixmap = QPixmap(new_widget.size()) 
     old_widget.render(self.old_pixmap) 

     self.timeline.start() 

     self.resize(new_widget.size()) 
     self.show() 

    def paintEvent(self, event): 
     if self.pixmap_opacity: 
      QWidget.paintEvent(self, event) 
      painter = QPainter(self) 
      painter.setOpacity(self.pixmap_opacity) 
      painter.drawPixmap(0, 0, self.old_pixmap) 

    def animate(self, value): 
     self.pixmap_opacity = 1.0 - value 
     self.update() 


class FaderTabWidget(QTabWidget): 
    def __init__(self, parent=None): 
     QTabWidget.__init__(self, parent) 
     self.currentChanged.connect(self.onCurrentIndex) 
     self.last = -1 
     self.current = self.currentIndex() 

    def onCurrentIndex(self, index): 
     self.last = self.current 
     self.current = self.currentIndex() 
     if self.widget(self.last): 
      self.widget(self.last).setCurrentIndex(1) 
      old_widget = self.widget(self.last).widget(0) 
      current_widget = self.widget(self.current).widget(0) 
      fade = self.widget(self.current).widget(1) 
      fade.start(old_widget, current_widget) 

    def addTab(self, widget, text): 
     stack = QStackedWidget(self) 
     stack.addWidget(widget) 
     fade = FaderWidget(self) 
     fade.timeline.finished.connect(lambda: stack.setCurrentIndex(0)) 
     stack.addWidget(fade) 
     stack.setCurrentIndex(0 if self.currentIndex() == -1 else 1) 
     QTabWidget.addTab(self, stack, text) 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 

    window = QWidget() 

    tabWidget = FaderTabWidget() 
    tabWidget.addTab(QCalendarWidget(), "Tab1") 
    editor = QTextEdit() 
    editor.setPlainText("Hello world! " * 100) 
    tabWidget.addTab(editor, "Tab2") 
    layout = QVBoxLayout(window) 
    layout.addWidget(tabWidget) 
    window.show() 
    sys.exit(app.exec_()) 
+0

ありがとうございました!しかし、どのようにすべてのUIのドライバファイルでこれを使用する。私は4-5uiファイルを含んでいます。これで、ui-to-py準拠のファイルを変更せずに、これをどのように追加すればいいですか? –

+0

デザイナーの昇格ウィジェットオプションを使用してfingerertabsのロジックを教えてください。そのようにしなければなりませんか? –

+0

イメージを丸いラベルで描く手助けはできますか?私はラベル(境界線の半径)のCSSを変更しようとしましたが、画像が上書きされました。画家を実装し、それにピクスマップを作成してラベルに追加する方法はありますか?申し訳ありませんが私の質問の限界に達したこの方法に到達する必要があります:/ –

関連する問題