Heim >Backend-Entwicklung >Python-Tutorial >PyQt implementiert den Schnittstellen-Flip-Switching-Effekt
In diesem Artikel wird hauptsächlich PyQt vorgestellt, um den Interface-Flip-Switching-Effekt im Detail zu realisieren. Interessierte Freunde können sich auf
PyQt beziehen, um den Interface-Flip-Switching-Effekt zu realisieren implementiert mit QGraphicsView, QGraphicsLinearLayout, QGraphicsWidget und anderen QT-Szenenbibliotheken. Es kann als kleiner Versuch des Qt-Szenarios angesehen werden. Der Inhalt ist nicht so tiefgreifend und der Programmeffekt ist nicht so willkürlich, wie Sie möchten. Vorerst werde ich den Code hier veröffentlichen, damit jeder ihn lernen und korrigieren kann.
Das Projekt umfasst vier Klassen:
Schnittstelle A, TestMainWindow, die als Seite A des Flip-Effekts fungiert.
Schnittstelle B, TestMainWindowTwo, wird als B-Seite des Flip-Effekts verwendet.
Zeichnungsschnittstelle: TestGraphicWidget, wird zum Zeichnen der Schnittstellen A und B verwendet.
Hauptschnittstelle: MainWindow ist ein transparentes Vollbildfenster, das die allgemeine Bühne für die Anzeige des gesamten Effekts darstellt. Es enthält eine QGraphicsScene und eine QGraphicsView, die zum Anzeigen der Schnittstellenumkehr und der Schnittstellenersetzung im Effekt verwendet werden.
Das Prinzip des gesamten Effekts lässt sich in mehreren Punkten zusammenfassen:
Fügen Sie zunächst alle für den gesamten Effekt erforderlichen Schnittstellen zu TestGraphicWidget hinzu. und dann hinzufügen TestGraphicWidget Fügen Sie es in QGraphicsScene ein und fügen Sie es dann über QGraphicsScene zur Hauptschnittstelle hinzu.
Dann wird die Schnittstellenumschaltung implementiert, zwei Funktionen, ganz einfach: A anzeigen, B entfernen und ausblenden;
def setOne(self): self.twoWidget.hide() self.oneWidget.show() self.layout.removeItem(self.twoTestWidget) self.layout.addItem(self.oneTestWidget) self.view.update() def setTwo(self): self.oneWidget.hide() self.twoWidget.show() self.layout.removeItem(self.oneTestWidget) self.layout.addItem(self.twoTestWidget) self.view.update()
Dann ist das Wichtigste, die Realisierung des Flip-Effekts, die einzigartige Flip-Methode von TestGraphicWidget, und die Parameter können entsprechend der tatsächlichen Situation angepasst werden.
def transeformR(self,count): r = self.form.boundingRect() for i in range(1,count): self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(91.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() self.view.update() self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(270 - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.view.update() if self.formflag %2 == 0: self.setOne() else: self.setTwo() for i in range(1,count): self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(270 + 93.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() self.view.update()
Es bietet außerdem zwei Methoden, um das Programm warten zu lassen, ohne dass die Schnittstelle hängen bleibt:
def sleep(self,msec): dieTime = QTime.currentTime().addMSecs(msec) print dieTime,QTime.currentTime() #a = 0 while( QTime.currentTime() < dieTime ): #print "000000000000" QCoreApplication.processEvents(QEventLoop.AllEvents, 100) def waitMethod(self): tt = QElapsedTimer() tt.start() q = QEventLoop() t = QTimer() t.setSingleShot(True) self.connect(t, SIGNAL("timeout()"), q.quit) t.start(1) # 5s timeout q.exec_() if(t.isActive()): t.stop() else: pass print tt.elapsed()
Der Quellcode wird unten als Referenz eingefügt. Dieser Quellcode kann direkt ausgeführt werden , intern Die Debugging-Informationen können ignoriert werden:
#coding:utf-8 ''''' Created on 2015 7 15 @author: guowu ''' from PyQt4.QtGui import QWidget, QTextEdit, QPushButton, QGraphicsScene,\ QGraphicsWidget, QGraphicsLinearLayout, QGraphicsView, QApplication,\ QTransform, QHBoxLayout, QPainter, QLabel, QGraphicsLayoutItem, QFont,\ QPixmap, QBrush from PyQt4.QtCore import Qt, QTime, QCoreApplication, QEventLoop, QObject,\ SIGNAL, QPoint, QTimer, QBasicTimer, QElapsedTimer, QPointF import sys import time class TestGraphicWidget(QGraphicsWidget): def __init__(self,parent=None): super(TestGraphicWidget,self).__init__(parent) self.setWindowFlags(Qt.Window) self.setWindowTitle("Turn Widget") self.resize(400,400) #self.setPos(QPoint(0,0)) self.mousePressed = False def closeEvent(self,event): print "closeclosetest" self.emit(SIGNAL("startTurn")) def mouseMoveEvent(self, event): print "move move" if self.mousePressed: #self.move(self.pos() + event.pos() - self.currentPos) self.setPos(self.pos() + event.pos() - self.currentPos) def mousePressEvent(self, event): if event.buttons() == Qt.LeftButton: self.currentPos = event.pos() self.mousePressed = True class TestMainWindow(QWidget): def __init__(self,parent=None): super(TestMainWindow,self).__init__(parent) #self.setStyleSheet("background: transparent;border:0px;") self.setAttribute(Qt.WA_TranslucentBackground,True) self.firstButton = QPushButton(u"翻转") self.secondButton = QPushButton(u"翻转") self.thirdButton = QPushButton(u"翻转") self.mainLayout = QHBoxLayout(self) self.mainLayout.addWidget(self.firstButton) self.mainLayout.addWidget(self.secondButton) self.mainLayout.addWidget(self.thirdButton) self.connect(self.firstButton, SIGNAL("clicked()"), self.startTurn) self.connect(self.secondButton, SIGNAL("clicked()"), self.startTurn) self.connect(self.thirdButton, SIGNAL("clicked()"), self.startTurn) def startTurn(self): self.emit(SIGNAL("buttonclicked")) def closeEvent(self,event): print "closeclosetest" self.emit(SIGNAL("startTurn")) def paintEvent(self,event): #print "paintevent" painter = QPainter(self) painter.setRenderHint(QPainter.SmoothPixmapTransform, True)#像素光滑 painter.setRenderHint(QPainter.Antialiasing, True)#反锯齿 pix = QPixmap("cloud-bak.jpg").scaled(self.width(),self.height()) painter.setBrush(QBrush(pix)) painter.drawRoundRect(self.rect(),5,5) class TestMainWindowTwo(QWidget): def __init__(self,parent=None): super(TestMainWindowTwo,self).__init__(parent) #self.setStyleSheet("QWidget{background: transparent;border:0px;}") self.setAttribute(Qt.WA_TranslucentBackground,True) self.firstButton = QPushButton(u"p翻转") self.secondButton = QPushButton(u"p翻转") self.thirdButton = QPushButton(u"p翻转") self.mainLayout = QHBoxLayout(self) self.mainLayout.addWidget(self.firstButton) self.mainLayout.addWidget(self.secondButton) self.mainLayout.addWidget(self.thirdButton) self.connect(self.firstButton, SIGNAL("clicked()"), self.startTurn) self.connect(self.secondButton, SIGNAL("clicked()"), self.startTurn) self.connect(self.thirdButton, SIGNAL("clicked()"), self.startTurn) def startTurn(self): self.emit(SIGNAL("buttonclicked")) def paintEvent(self,event): #print "paintevent" painter = QPainter(self) painter.setRenderHint(QPainter.SmoothPixmapTransform, True)#像素光滑 painter.setRenderHint(QPainter.Antialiasing, True)#反锯齿 pix = QPixmap("login.jpg").scaled(self.width(),self.height()) painter.setBrush(QBrush(pix)) painter.drawRoundRect(self.rect(),5,5) class MainWindow(QWidget): def __init__(self,parent=None): super(MainWindow,self).__init__(parent) #self.setStyleSheet("QGraphicsView{background:rgb(0,0,0,0);border:0px;}") self.formflag = 0 self.scene = QGraphicsScene() self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint) self.setAttribute(Qt.WA_TranslucentBackground,True) #创建部件,并关联它们的信号和槽 self.oneWidget = TestMainWindow() self.connect(self.oneWidget, SIGNAL("buttonclicked"),self.startTurn) self.twoWidget = TestMainWindowTwo() self.connect(self.twoWidget, SIGNAL("buttonclicked"),self.startTurn) #self.textEdit = QGraphicsLayoutItem(self.edit) self.oneTestWidget = self.scene.addWidget(self.oneWidget) self.twoTestWidget = self.scene.addWidget(self.twoWidget) self.form = TestGraphicWidget() self.connect(self.form, SIGNAL("startTurn"),self.close) #将部件添加到布局管理器中 self.layout = QGraphicsLinearLayout(self.form) self.layout.setSpacing(0) self.layout.addItem(self.oneTestWidget) self.layout.addItem(self.twoTestWidget) self.layout.removeItem(self.twoTestWidget) self.twoWidget.hide() #创建图形部件,设置其为一个顶层窗口,然后在其上应用布局 #self.form.setWindowFlags(Qt.Window|Qt.FramelessWindowHint) #self.form.setWindowTitle("Widget Item") #self.form.setLayout(layout) self.scene.addItem(self.form) #self.form.setPos(QPointF(0,0)) #self.form.hide() self.view = QGraphicsView(self.scene,self) #self.view.setScene(self.scene) self.view.setRenderHint(QPainter.Antialiasing) self.view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate) self.view.resize(QApplication.desktop().width(),QApplication.desktop().height()) self.view.setStyleSheet("background: transparent;border:0px;") self.view.setWindowFlags(Qt.FramelessWindowHint) self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.view.move(QPoint(0,0)) #self.view.setAttribute(Qt.WA_TranslucentBackground,True) #self.form.resize(500,500) #self.form.setWindowFlags(Qt.FramelessWindowHint) #for(int i=1;i<=360;i++) def setOne(self): self.twoWidget.hide() self.oneWidget.show() self.layout.removeItem(self.twoTestWidget) self.layout.addItem(self.oneTestWidget) self.view.update() def setTwo(self): self.oneWidget.hide() self.twoWidget.show() self.layout.removeItem(self.oneTestWidget) self.layout.addItem(self.twoTestWidget) self.view.update() def transeformT(self,count): r = self.form.boundingRect() for i in range(1,count): print "............." self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(364.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() #self.sleep(1) #time.sleep(1) self.view.update() # def transeformS(self,count): r = self.form.boundingRect() for i in range(1,count): print "............." self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(182.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() self.view.update() def transeformR(self,count): r = self.form.boundingRect() for i in range(1,count): print "............." self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(91.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() self.view.update() self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(270 - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.view.update() if self.formflag %2 == 0: self.setOne() else: self.setTwo() for i in range(1,count): self.form.setTransform(QTransform() .translate(r.width() / 2, r.height() / 2) .rotate(270 + 93.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width() / 2, -r.height() / 2)) self.waitMethod() self.view.update() def transeformB(self,count): r = self.form.boundingRect() for i in range(1,count): print "............." self.form.setTransform(QTransform() .translate(r.width(), r.height()) .rotate(91.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width(), -r.height())) self.waitMethod() self.view.update() self.form.setTransform(QTransform() .translate(r.width(), r.height()) .rotate(270 - 360 * 1, Qt.YAxis) .translate(-r.width(), -r.height())) self.view.update() for i in range(1,count): self.form.setTransform(QTransform() .translate(r.width(), r.height()) .rotate(270 + 93.00/count*i - 360 * 1, Qt.YAxis) .translate(-r.width(), -r.height())) self.waitMethod() self.view.update() def transeform(self): print self.form.pos() #self.scene.itemAt(QPointF) rxx = self.scene.itemsBoundingRect() rx = self.form.boundingRect() r = self.form.geometry() print r,rx,rxx for i in range(1,361): print self.form.pos() print "............." #print r.width(),r.height() transform = QTransform() transform.translate(r.width() / 2, r.height()/2)#中心点,原点 transform.rotate(i - 360 * 1, Qt.YAxis)#绕X轴旋转角度 self.form.setTransform(transform) # self.form.setTransform(QTransform() # .translate(r.width() / 2, r.height() / 2) # .rotate(i - 360 * 1, Qt.YAxis) # .translate(-r.width() / 2, -r.height() / 2)) # self.form.setTransform(QTransform() # .translate(250, 250) # .rotate(i - 360 * 1, Qt.YAxis) # .translate(-250, -250)) self.waitMethod() self.view.update() # def startTurn(self): self.formflag += 1 self.transeformR(30) #self.transeform() #self.form.close() #self.view.close() def closeEvent(self,event): print "close" self.form.close() self.view.close() self.close() def sleep(self,msec): dieTime = QTime.currentTime().addMSecs(msec) print dieTime,QTime.currentTime() #a = 0 while( QTime.currentTime() < dieTime ): #print "000000000000" QCoreApplication.processEvents(QEventLoop.AllEvents, 100) def waitMethod(self): tt = QElapsedTimer() tt.start() q = QEventLoop() t = QTimer() t.setSingleShot(True) self.connect(t, SIGNAL("timeout()"), q.quit) t.start(1) # 5s timeout q.exec_() if(t.isActive()): t.stop() else: pass print tt.elapsed() if __name__ == "__main__": app = QApplication(sys.argv) font = QFont() font.setPointSize(16) font.setFamily(("Roman Times")) app.setFont(font) c = MainWindow() c.show() c.move(QPoint(0,0)) app.exec_()
Verwandte Empfehlungen:
PyQt5-Layoutverwaltung, die Sie jeden Tag lernen müssen
Python PyQt4 implementiert den QQ-Schubladeneffekt
Das obige ist der detaillierte Inhalt vonPyQt implementiert den Schnittstellen-Flip-Switching-Effekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!