PyQtはインターフェースフリップスイッチング効果を実装します
この記事では主にインターフェース反転効果を実現するための PyQt を詳しく紹介します。興味のある方は参考にしてください。
PyQt は QGraphicsView、QGraphicsLinearLayout、QGraphicsWidget のシーン関数を使用して実現します。および Qt シーンに関連するその他のライブラリが使用されます。これは、Qt シナリオの小さな試みと見なすことができます。内容は深くなく、プログラムの効果も希望するほど任意ではありません。さらに改善する必要があります。当面は、誰もが学び、修正できるように、ここにコードを投稿します。
このプロジェクトには、
Interface A、TestMainWindow という 4 つのクラスが含まれています。これは、フリップ効果のサイド A として機能するために使用されます。
インターフェイス B、TestMainWindowTwo は、反転効果の B 側として使用されます。
描画インターフェース: TestGraphicWidget、インターフェース A と B の描画に使用されます。
メインインターフェイス: MainWindow は、エフェクト表示全体の一般的なステージであるフルスクリーンの透明ウィンドウで、エフェクト内のインターフェイスの反転とインターフェイスの置換を表示するために使用される QGraphicsScene と QGraphicsView が含まれています。
エフェクト全体の原理は、いくつかのポイントに要約されています:
まず、エフェクト全体に必要なすべてのインターフェースを TestGraphicWidget に追加し、次に TestGraphicWidget を QGraphicsScene に配置し、それを経由してメインインターフェースに追加します。 Qグラフィックシーン。
次に、インターフェイスの切り替えが実装されており、A を表示するには B を削除して非表示にし、B を削除するには A を非表示にします。
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()
それでは、最も重要なことですが、反転効果の実現には TestGraphicWidget の独自の反転メソッドが使用されており、実際の状況に応じてパラメータを調整できます。
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()
そして、インターフェイスがスタックすることなくプログラムを待機させるための 2 つのメソッドが提供されます:
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()
ソース コードは参考のために以下に貼り付けられています。このソース コードは直接実行でき、内部のデバッグ情報は無視できます:
#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_()
関連する推奨事項:
QQ ドロワー効果を実現するには Python PyQt4 を学習する必要があります
以上がPyQtはインターフェースフリップスイッチング効果を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Xiaomi 14Ultraは、今年最も人気のあるXiaomiモデルの1つです.Xiaomi 14Ultraは、プロセッサとさまざまな構成をアップグレードするだけでなく、多くの新しい機能アプリケーションをユーザーにもたらします.これは、Xiaomi 14Ultra携帯電話の販売からもわかります.人気がありますが、まだ知られていない一般的に使用される機能がいくつかあります。では、Xiaomi 14Ultraはどのようにして4gと5gを切り替えるのでしょうか?以下に具体的な内容をご紹介していきます! Xiaomi 14Ultraで4gと5gを切り替えるにはどうすればよいですか? 1. 電話機の設定メニューを開きます。 2. 設定メニューで「ネットワーク」および「モバイル ネットワーク」オプションを見つけて選択します。 3. モバイル ネットワーク設定に、[優先ネットワーク タイプ] オプションが表示されます。 4. このオプションをクリックまたは選択すると、次の内容が表示されます。

Pyqt5のインストールエラー?素早い解決策が明らかに! PyQt5 は、多くの開発者が美しいグラフィカル ユーザー インターフェイスを作成するために使用する人気の Python GUI 開発ツールキットです。ただし、PyQt5 をインストールするときに、エラーが発生することがあります。この記事では、いくつかの一般的な PyQt5 インストール エラーを紹介し、PyQt5 をスムーズにインストールするための解決策を提供します。エラー:「Nomodulenamed'PyQt5'」 このエラーは通常、PyQt5 モジュールが原因で発生します

Win11 Home Edition を Win11 Professional Edition に変換するにはどうすればよいですか? Win11 システムは Home Edition、Professional Edition、Enterprise Edition などに分かれており、ほとんどの Win11 ノートブックには Win11 Home Edition システムがプリインストールされています。今日は、エディターが win11 ホーム バージョンからプロフェッショナル バージョンに切り替える手順を示します! 1. まず、win11 デスクトップとプロパティでこのコンピューターを右クリックします。 2. 「プロダクト キーの変更」または「Windows のアップグレード」をクリックします。 3. 入力後、「プロダクト キーの変更」をクリックします。 4. アクティベーション キー 8G7XN-V7YWC-W8RPC-V73KB-YWRDB を入力し、[次へ] を選択します。 5.その後、成功を促すメッセージが表示されるので、win11 home バージョンを win11 professional バージョンにアップグレードできます。

Python の人気に伴い、PyQt5 は多くの人にとって迅速な GUI 開発のための最初の選択肢ツールの 1 つになりましたが、インストールの問題は避けられません。以下は、PyQt5 のインストールに関するいくつかの一般的な問題とその解決策です。 PyQt5 のインストール時に、sip モジュールが見つからないというエラー メッセージが表示される この問題は、通常、pip を使用して PyQt5 をインストールするときに発生します。このエラーの原因は sip モジュールへの依存関係がないため、最初に sip モジュールを手動でインストールする必要があります。コマンドラインに次のコードを入力します: pipinsta

Win システムに初めて触れたとき、多くの友人は慣れていないかもしれません。コンピューターにはデュアル システムがあります。現時点では、実際に 2 つのシステムを切り替えることができます。切り替えの詳細な手順を見てみましょう。 2 つのシステム間で。 win10システムで2つのシステムを切り替える方法 1. ショートカットキーの切り替え 1. 「win」+「R」キーを押してファイル名を指定して実行を開きます 2. 実行ボックスに「msconfig」と入力し、「OK」をクリックします 3. 開いた「」で「システム構成」インターフェイスで、必要なシステムを選択し、「デフォルトとして設定」をクリックします。完了後、「再起動」で切り替えを完了できます。方法 2. 起動時に切り替えを選択します。 1. デュアル システムの場合、選択操作インターフェイス起動時に表示されます。キーボードの「上下キー」を使用してシステムを選択できます。

Python を学習していて GUI アプリケーションを開発したい場合、PyQt5 は非常に良い選択です。これは、Python での PyQt ライブラリのバインドされたバージョンであり、Qt グラフィック ライブラリの呼び出しと開発が非常に便利になります。ただし、PyQt5 のインストール時に問題が発生する場合があります。このガイドでは、インストール エラーの問題を迅速に解決するためのいくつかの手順を説明し、具体的なコード例も添付します。 Python のバージョンが正しいことを確認してください PyQt5 は Python ベースのライブラリであるため、最初に

起動時に Apple デュアル システムを切り替える方法 Apple コンピュータは強力なデバイスなので、独自の macOS オペレーティング システムに加えて、Windows などの他のオペレーティング システムをインストールしてデュアル システム切り替えを実現することもできます。では、起動時に 2 つのシステムを切り替えるにはどうすればよいでしょうか?この記事では、Apple コンピュータのデュアル システムを切り替える方法を紹介します。まず、デュアル システムをインストールする前に、Apple コンピュータがデュアル システムの切り替えをサポートしているかどうかを確認する必要があります。一般的に言えば、Apple コンピュータは以下に基づいています。

プレイヤーは、Eye of Deep Space でゲームをプレイするときに画面を反転できます。多くのユーザーは、Eye of Deep Space で画面を反転する方法を知りません。プレイヤーは、コントロール センターで画面の回転をサポートするオプションをオンにしてから、に戻る必要があります。ゲーム。 Deep Space Eye の画面を反転する方法 1. 携帯電話の画面を開き、指で画面の下から上にスライドさせます。 2. コントロールセンターを開くと、コントロールセンターの右上隅に画面の回転をオフにするスイッチがあります。 3. それをクリックして画面の回転をオンにすると、コントロール センターで回転を制御するアイコンが強調表示されていることがわかります。 4. 画面の回転をサポートするアプリケーションを開くと、携帯電話の向きが変わるとアプリケーションも回転します。
