1. 程式人生 > >python3+PyQt5 重新實現QT事件處理程式

python3+PyQt5 重新實現QT事件處理程式

本文是對《Python Qt GUI快速程式設計》的第10章的例子events用Python3+PyQt5進行改寫,涉及到重新實現QWidget的事件處理程式。本例子涉及到上下文選單,滑鼠事件,鍵盤事件,可作為重新實現事件處理程式的參考。
注:在建立上下文選單最簡單的方式使用Qwidget.addAction()把動作新增到視窗部件中,再把視窗部件的上下文選單策略設定為Qt.ActionsContextMenu即可,但是如果像本例子一樣要根據不同的狀態來提供不同的選項,則要重新實現上下文選單事件處理程式。

#!/usr/bin/env python3
import sys
from PyQt5.QtCore import
(QEvent, QTimer, Qt) from PyQt5.QtWidgets import (QApplication, QMenu, QWidget) from PyQt5.QtGui import QPainter class Widget(QWidget): def __init__(self, parent=None): super(Widget, self).__init__(parent) self.justDoubleClicked = False self.key = "" self.text = ""
self.message = "" self.resize(400, 300) self.move(100, 100) self.setWindowTitle("Events") QTimer.singleShot(0, self.giveHelp) # Avoids first resize msg def giveHelp(self): self.text = "Click to toggle mouse tracking" self.update() def closeEvent
(self, event):
print("Closed") 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("Thre&e") 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() def paintEvent(self, event): text = self.text i = text.find("\n\n") if i >= 0: text = text[0:i] if self.key: text += "\n\nYou pressed: {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) def clearMessage(self): self.message="" def resizeEvent(self, event): self.text = "Resized to QSize({0}, {1})".format( event.size().width(), event.size().height()) self.update() def mouseReleaseEvent(self, event): if self.justDoubleClicked: self.justDoubleClicked = False else: self.setMouseTracking(not self.hasMouseTracking()) if self.hasMouseTracking(): self.text = "Mouse tracking is on.\n"+\ "Try moving the mouse!\n"+\ "Single click to switch it off" else: self.text = "Mouse tracking is off.\n"+\ "Single click to switch it on" self.update() def mouseMoveEvent(self, event): if not self.justDoubleClicked: globalPos = self.mapToGlobal(event.pos()) self.text = "The mouse is at\nQPoint({0}, {1}) "+\ "in widget coords, and\n"+\ "QPoint({2}, {3}) in screen coords".format( event.pos().x(), event.pos().y(), globalPos.x(), globalPos.y()) self.update() def mouseDoubleClickEvent(self, event): self.justDoubleClicked = True self.text = "Double-clicked." self.update() def keyPressEvent(self, event): 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+PageUp" else: self.key = "PageUp" elif event.key() == Qt.Key_PageDown: if event.modifiers() & Qt.ControlModifier: self.key = "Ctrl+PageDown" else: self.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 event(self, event): if (event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab): self.key = "Tab captured in event()" self.update() return True return QWidget.event(self, event) if __name__ == "__main__": app = QApplication(sys.argv) form = Widget() form.show() app.exec_()

執行結果:
這裡寫圖片描述

相關推薦

python3+PyQt5 重新實現QT事件處理程式

本文是對《Python Qt GUI快速程式設計》的第10章的例子events用Python3+PyQt5進行改寫,涉及到重新實現QWidget的事件處理程式。本例子涉及到上下文選單,滑鼠事件,鍵盤事件,可作為重新實現事件處理程式的參考。 注:在建立上下文選單

初步剖析QT事件處理全過程(Windows)

職責 spa message alt cati 窗口 初步 負責 啟動 一、說起Qt事件處理,在windows平臺下,當然離不開Win32: Win32程序的基本結構:  1.註冊窗口;  2.創建窗口;  3.啟動由GetMessage和DispatchMessage構成

Qt ------ 事件處理機制

後處理 分發 異步 ant ont 事件循環 tar rpo 基類 簡介 在Qt中,事件被封裝成一個個對象,所有的事件均繼承自抽象類QEvent。Qt是以事件驅動UI工具集。Signals/Slots在多線程中的實現也是依賴於Qt的事件處理機制。在Qt中,事件被封裝成一個個

17.QT-事件處理分析、事件過濾器、拖放事件

期待 使用 lis 相關 事件處理 [] 支持 實現 endif Qt事件處理介紹 Qt平臺會將系統產生的消息轉換為Qt事件 Qt事件是一個QEvent的對象 Qt事件用來描述程序內部或外部發生的動作 任意的QObject對象都具備事件處理的能力 Qt常見

QT開發——QT事件處理機制

ref:https://blog.csdn.net/A642960662/article/details/66473871 一、QT事件簡介     QT程式是事件驅動的, 程式的每個動作都是由內部某個事件所觸發。QT事件的發生和處理成為程式執行的主線

Qt事件處理機制整個流程--以滑鼠在一個視窗中點選為例

轉載自:http://mobile.51cto.com/symbian-272812.htm,在此謝謝原作者的分享! ------------------------第一部分----------------------   本篇來介紹Qt 事件處理機制 。深入瞭解事件處理系統對

4 C 程式設計學習——窗體Paint事件處理程式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

事件繫結(事件處理程式

事件處理程式(事件繫結):響應某個事件的函式就叫做事件處理程式(或事件偵聽器)。 為事件指定處理程式的方式: 1.HTML 事件處理程式:某個元素支援的每種事件,都可以使用一個與相應事件處理程式同名的 HTML 特性來指定。這個特性的值應該是能夠執行的 JavaScript 程式

Qt事件處理

Qt事件處理 Qt事件處理的五個層次 Qt 應用程式 事件處理 的五個層次,同時也是時間流程如下圖所示: 說明如下: sendEvent()會把event直接傳送給QCoreApplication的notify(),postEvent()把event追加到事件佇列中最終也要呼叫notify(

javascript中的事件處理程式

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 視窗事件屬性(Window Event Attributes) ::::::::::::::::::

實現QT單例程式 QSystemSemaphore QSharedMemory

有的時候我們編寫的專案,需要單例執行的功能,下面採用QT共享記憶體的方式實現單例程式: int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiSca

《Javascript 高階程式設計(第三版)》筆記0x16 事件:事件流、事件處理程式

目錄 事件流     事件冒泡(event bubbling)     事件捕獲(event capturing)     DOM事件流  事件處理程式      HTML

跨瀏覽器事件處理程式

var EventUtil = { addHandler: function(element, type, handler){ if (element.addEventListener){ element.addEventListener(type

JavaScript事件處理程式

前言 事件就是使用者或瀏覽器自身執行的某種動作。諸如 click、load 和 mouseover,都是事件的名字。而響應某個事件的函式就叫做事件處理程式(或事件偵聽器)。 事件處理程式的名字以 on 開頭,因此 click 事件的事件處理程式就是 onclic

事件處理程式(HTML)

HTML事件處理程式 通過設定HTML標籤特性來繫結事件處理程式。 處理方式(如圖): 1:會建立一個封裝元素屬性值的函式 2:會在這個函式中建立一個event事件物件 <form> <input name="username" value="">

事件處理程式 (DOM0級)

DOM0事件處理程式 每個元素都有自己的事件處理程式屬性,那麼直接獲取物件,然後在物件上設定事件處理程式屬性。  1:獲取節點物件引用 2:在事件成員上設定處理函式,這時函式內部this指向節點物件。 <ul id="u-1"> <li>

QT事件處理(以按鈕為例子)

<iframe id="cproIframe_u1788635_2" width="336" height="280" src="http://pos.baidu.com/acom?adn=3&amp;at=231&amp;aurl=&amp;cad=1&amp;cc

JavaScript和HTML事件處理程式屬性中的this的含義

HTML裡事件處理程式屬性中的this: HTML文件裡事件處理程式屬性中的this表示觸發此事件的元素。例如: <iframe id="iframe" src="{{url}}" width="{{iframewidth}}" height="{{iframehe

js學習筆記:事件——事件流、事件處理程式事件物件

Javascript與HTML之間的互動是通過事件實現的。 事件,就是文件或瀏覽器視窗中發生的一些特定的互動瞬間。 可以使用偵聽器來預定事件,以便事件發生時執行相應程式碼。 事件流 事件流描述的是從頁面中接受事件的順序。 事件冒泡 IE的事件

JS事件詳解(二) —— 事件處理程式事件的繫結)

事件繫結方法 方法一:直接在HTML標籤中繫結 在html標籤中新增“on”+事件名稱的屬性來繫結事件 事件處理程式可直接寫在屬性值當中 <div class="demo" onclick="console.log(this)">&l