最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解PyQt5?事件處理機制

 更新時間:2022年11月30日 10:29:12   作者:SongYuLong的博客  
PyQt為事件處理提供了兩種機制高級的信號與槽機制,以及低級的事件處理機制,這篇文章主要介紹了PyQt5?事件處理機制,需要的朋友可以參考下

PyQt5 事件處理機制

PyQt為事件處理提供了兩種機制:高級的信號與槽機制,以及低級的事件處理機制。信號與槽可以說是對事件處理機制的高級封裝。
常見事件類型:

  • 鍵盤事件:按鍵按下和松開。
  • 鼠標事件:鼠標指針移動,鼠標按下和松開。
  • 拖放事件:用鼠標進行拖放。
  • 滾輪事件:鼠標滾輪滾動。
  • 繪屏事件:重繪屏幕的某些部分。
  • 定時事件:定時器到時。
  • 焦點事件:鍵盤焦點移動。
  • 進入/離開事件:鼠標指針移入Widget內(nèi),或者移出。
  • 移動事件:Widget的位置改變。
  • 大小改變事件:Widget的大小改變。
  • 顯示/隱藏事件:Widget顯示和隱藏。
  • 窗口事件:窗口是否為當前窗口。

PyQt提供了如下5種事件處理和過濾方法(有弱到強):

  • 重新實現(xiàn)事件函數(shù),比如mousePressEvent(),keyPressEvent()等等。
  • 重新實現(xiàn)QObject.event()。
  • 安裝時間過濾器。
  • 在QApplication中安裝事件過濾器。
  • 重新實現(xiàn)QAppliction的notifiy()方法。
import sys
from PyQt5.QtWidgets import (QApplication, QMenu, QWidget)
from PyQt5.QtCore import (QEvent, QTimer, Qt)
from PyQt5.QtGui import QPainter

class MyEventDemoWindow(QWidget):
    def __init__(self, parent=None):
        super(MyEventDemoWindow, self).__init__(parent)
        self.justDoubleClikcked = False
        self.key = ""
        self.text = ""
        self.message = ""
        self.resize(400, 300)
        self.move(100, 100)
        self.setWindowTitle("Events Demo 1")
        QTimer.singleShot(1000, self.giveHelp)


    def giveHelp(self):
        self.text = "請點擊這里觸發(fā)追蹤鼠標功能"
        self.update() # 重繪事件,也就是除非paintEvent函數(shù)
    
    # 重新實現(xiàn)關(guān)閉事件
    def closeEvent(self, event):
        print("Closed")
    
    # 重新實現(xiàn)上下文菜單事件
    def contextMenuEvent(self, event):
        menu = QMenu(self)
        oneAction = menu.addAction("&One")
        twoAction = menu.addAction("&Two")
        oneAction.triggered.connect(self.one)
        twoAction.triggered.connect(self.two)
        if not self.message:
            menu.addSeparator()
            threeAction = menu.addAction("&Three")
            threeAction.triggered.connect(self.three)
        menu.exec_(event.globalPos())
        
    def one(self):
        self.message = "Menu Option One"
        self.update()
    
    def two(self):
        self.message = "Menu Option Two"
        self.update()

    def three(self):
        self.message = "Menu Option Three"
        self.update()

    '''重新實現(xiàn)繪制事件'''
    def paintEvent(self, event):
        text = self.text
        i = text.find("\n\n")
        if i >= 0:
            text = text[0:i]
        if self.key:
            text += "\n\n你按下了:{0}".format(self.key)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.TextAntialiasing)
        painter.drawText(self.rect(), Qt.AlignCenter, text) # 繪制文本
        if self.message:
            painter.drawText(self.rect(), Qt.AlignBottom | Qt.AlignHCenter, self.message)
            QTimer.singleShot(5000, self.clearMessage)
            QTimer.singleShot(5000, self.update)

    # 清空文本信息槽函數(shù)
    def clearMessage(self):
        self.message = ""
        
    # 重新實現(xiàn)調(diào)整窗口大小事件
    def resizeEvent(self, event):
        self.text = "調(diào)整窗口大小為: QSize({0}, {1})".format(event.size().width(), event.size().height())
        self.update()
    
    # 重新實現(xiàn)鼠標釋放事件
    def mouseReleaseEvent(self, event) -> None:
        if self.justDoubleClikcked:
            self.justDoubleClikcked = False
        else :
            self.setMouseTracking(not self.hasMouseTracking()) # 單擊鼠標
            if self.hasMouseTracking():
                self.text = "你釋放了鼠標 開啟鼠標跟蹤功能.\n\n" + \
                        "請移動鼠標\n\n" + \
                        "單擊鼠標可以關(guān)閉這個功能"
            else:
                self.text = "你釋放了鼠標  關(guān)閉鼠標跟蹤功能" + \
                        "單擊鼠標可以開啟這個功能"
        self.update()
 
    '''重新實現(xiàn)鼠標移動事件'''
    def mouseMoveEvent(self, event):
        if not self.justDoubleClikcked:
            globalPos = self.mapToGlobal(event.pos())# 將窗口坐標轉(zhuǎn)換為屏幕坐標
            self.text = """鼠標位置:
            窗口坐標為:QPoint({0}, {1})
            屏幕坐標為:QPoint({2}, {3})""".format(event.pos().x(), event.pos().y(), globalPos.x(), globalPos.y())
            self.update()

    '''重新實現(xiàn)鼠標雙擊事件'''
    def mouseDoubleClickEvent(self, event):
        self.justDoubleClikcked = True
        self.text = "你雙擊了鼠標"
        self.update()

    def mousePressEvent(self, event):
        self.text = "你按下了鼠標"
        self.update()

    def keyPressEvent(self, event):
        self.text = "你按下了按鍵"
        self.key = ""
        if event.key() == Qt.Key_Home:
            self.key = "Home"
        elif event.key() == Qt.Key_End:
            self.key = "End"
        elif event.key() == Qt.Key_PageUp:
            if event.modifiers() & Qt.ControlModifier:
                self.key = "Ctrl + Page Up"
            else:
                self.key = "Page Up"
        elif event.key() == Qt.Key_PageDown:
            if event.modifiers() & Qt.ControlModifier:
                self.key = "Ctrl + Key_PageDown"
            else:
                self.key = "Key_PageDown"
        elif Qt.Key_A <= event.key() <= Qt.Key_Z:
            if event.modifiers() & Qt.ShiftModifier:
                self.key = "Shift+"
            self.key += event.text()
            
        if self.key:
            self.key = self.key
            self.update()
        else:
            QWidget.keyPressEvent(self, event)
    
    def keyReleaseEvent(self, event):
        self.text = "你釋放了按鍵"
        self.update()

    '''重新實現(xiàn)event,捕獲Tab鍵'''
    def event(self, event):
        if (event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab):
            self.key = "在event() 中捕獲Tab鍵"
            self.update()
            return True # 返回True表示本次事件已經(jīng)執(zhí)行處理
        else:
            return QWidget.event(self, event) # 繼續(xù)處理事件
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MyEventDemoWindow()
    win.show()
    sys.exit(app.exec_())

在這里插入圖片描述

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

class EventFilter(QDialog):
    def __init__(self, parent=None):
        super(EventFilter, self).__init__(parent)
        self.setWindowTitle("事件過濾器")

        self.label1 = QLabel("請點擊")
        self.label2 = QLabel("請點擊")
        self.label3 = QLabel("請點擊")
        self.LabelState = QLabel("test")

        self.image1 = QImage("pyqt5/images/cartoon1.ico")
        self.image2 = QImage("pyqt5/images/cartoon1.ico")
        self.image3 = QImage("pyqt5/images/cartoon1.ico")

        self.width = 600
        self.height = 300

        self.resize(self.width, self.height)

        self.label1.installEventFilter(self)
        self.label2.installEventFilter(self)
        self.label3.installEventFilter(self)

        mainLayout = QGridLayout(self)
        mainLayout.addWidget(self.label1, 500, 0)
        mainLayout.addWidget(self.label2, 500, 1)
        mainLayout.addWidget(self.label3, 500, 2)
        mainLayout.addWidget(self.LabelState, 600, 1)
        self.setLayout(mainLayout)

    def eventFilter(self, watched, event):
        # print(type(watched))
        if watched == self.label1: # 只對label1的點擊事件進行過濾,重寫其行為,其它事件會被忽略
            if event.type() == QEvent.MouseButtonPress: # 這里對鼠標按下事件進行過濾,重寫其行為
                mouseEvent = QMouseEvent(event)
                if mouseEvent.buttons() == Qt.LeftButton:
                    self.LabelState.setText("按下鼠標左鍵")
                elif mouseEvent.buttons() == Qt.MidButton:
                    self.LabelState.setText("按下鼠標中鍵")
                elif mouseEvent.buttons() == Qt.RightButton:
                    self.LabelState.setText("按下鼠標右鍵")

                '''轉(zhuǎn)換圖片大小'''
                transform = QTransform()
                transform.scale(0.5, 0.5)
                tmp = self.image1.transformed(transform)
                self.label1.setPixmap(QPixmap.fromImage(tmp))

            if event.type() == QEvent.MouseButtonRelease: # 這里對鼠標釋放事件進行過濾,重寫其行為
                self.LabelState.setText("釋放鼠標按鍵")
                self.label1.setPixmap(QPixmap.fromImage(self.image1))
        return QDialog.eventFilter(self, watched, event) # 對于其它情況,會返回系統(tǒng)默認的事件處理方法
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = EventFilter()
    win.show()
    app.exec_()

在這里插入圖片描述

到此這篇關(guān)于PyQt5 事件處理機制的文章就介紹到這了,更多相關(guān)PyQt5 事件處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python中四舍五入的正確打開方式

    python中四舍五入的正確打開方式

    這篇文章主要介紹了python中四舍五入的正確打開方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 用Python監(jiān)控NASA TV直播畫面的實現(xiàn)步驟

    用Python監(jiān)控NASA TV直播畫面的實現(xiàn)步驟

    本文分享一個名為"Spacestills"的開源程序,它可以用于查看 NASA TV 的直播畫面(靜止幀)
    2021-05-05
  • Python+MongoDB自增鍵值的簡單實現(xiàn)

    Python+MongoDB自增鍵值的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄狿ython+MongoDB自增鍵值的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • python使用PIL縮放網(wǎng)絡(luò)圖片并保存的方法

    python使用PIL縮放網(wǎng)絡(luò)圖片并保存的方法

    這篇文章主要介紹了python使用PIL縮放網(wǎng)絡(luò)圖片并保存的方法,涉及Python操作網(wǎng)絡(luò)圖片的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼

    這篇文章主要介紹了flask使用session保存登錄狀態(tài)及攔截未登錄請求代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 詳解Python的lambda函數(shù)用法

    詳解Python的lambda函數(shù)用法

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著lambda函數(shù)用法展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python PyQt5實戰(zhàn)項目之查詢器的實現(xiàn)流程詳解

    Python PyQt5實戰(zhàn)項目之查詢器的實現(xiàn)流程詳解

    PyQt5以一套Python模塊的形式來實現(xiàn)功能。它包含了超過620個類,600個方法和函數(shù)。它是一個多平臺的工具套件,它可以運行在所有的主流操作系統(tǒng)中,包含Unix,Windows和Mac OS。PyQt5采用雙重許可模式。開發(fā)者可以在GPL和社區(qū)授權(quán)之間選擇
    2021-11-11
  • 利用Python微信群發(fā)英語每日一句

    利用Python微信群發(fā)英語每日一句

    這篇文章主要為大家詳細介紹了Python如何利用wxauto實現(xiàn)微信群發(fā)消息,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • PyCharm Community安裝與配置的詳細教程

    PyCharm Community安裝與配置的詳細教程

    這篇文章主要介紹了PyCharm Community安裝與配置的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 用python處理圖片實現(xiàn)圖像中的像素訪問

    用python處理圖片實現(xiàn)圖像中的像素訪問

    本篇文章主要介紹了用python處理圖片實現(xiàn)圖像中的像素訪問,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05

最新評論

巫溪县| 贵南县| 汽车| 田东县| 会泽县| 龙州县| 临泉县| 陵水| 旺苍县| 无为县| 成都市| 太谷县| 庆云县| 墨竹工卡县| 平罗县| 襄城县| 忻城县| 紫阳县| 赞皇县| 山丹县| 滦平县| 新昌县| 江西省| 建始县| 淮北市| 贵溪市| 清水县| 隆林| 湟中县| 石景山区| 靖西县| 东港市| 临安市| 武宣县| 大同县| 周口市| 迁安市| 瑞安市| 钟山县| 北宁市| 阳春市|