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&at=231&aurl=&cad=1&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