Pyqt4學習筆記-事件和信號

来源:http://www.cnblogs.com/shadow-ccos/archive/2016/02/22/5208344.html
-Advertisement-
Play Games

調用應用的 exec_() 方法之後,應用進入主迴圈。主迴圈獲取事件並把它們發往對象。應用在它的生命周期中產生的不同事件交互。事件主要由用戶產生,但是它們也可以由其他方式產生,如:互聯網,視窗管理器,定時器,當一個特殊的事件發生時,將發射信號,“槽 ”可以是任何Python調用,當鏈接到槽的信號發射


調用應用的 exec_() 方法之後,應用進入主迴圈。主迴圈獲取事件並把它們發往對象。應用在它的生命周期中產生的不同事件交互。事件主要由用戶產生,但是它們也可以由其他方式產生,如:互聯網,視窗管理器,定時器,當一個特殊的事件發生時,將發射信號,“槽 ”可以是任何Python調用,當鏈接到槽的信號發射,該槽將被調用。

在事件模型中,有三個參與者:
event source:事件源,事件來源對象代理了事件的目標要處理的任務
event object:事件對象,指狀態改變的對象,它產生了事件。 事件對象 (Event)封裝了事件源的狀態改變。
event target:事件目標,事件對象想要想要通知的對象,貌似這個不是必須的。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class LcdSlider(QtGui.QWidget):

    def __init__(self):
        super(LcdSlider, self).__init__()

        self.initUI()

    def initUI(self):

        lcd = QtGui.QLCDNumber(self)
        # 初始化數字LCD面板
        slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        # 初始化水平滑塊

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(slider)

        self.setLayout(vbox)

        self.connect(slider,  QtCore.SIGNAL('valueChanged(int)'), lcd,
                     QtCore.SLOT('display(int)'))
        # 滑塊為事件源,當滑塊收到valuechange(int)的信號之後,lcd的被指定的“槽”display(int)會被調用

        self.setWindowTitle('Signal & slot')
        self.resize(250, 150)


app = QtGui.QApplication(sys.argv)
ex = LcdSlider()
ex.show()
sys.exit(app.exec_())

connect方法有4個參數,sender是發送信號的對象,signal是發射的信號,receiver是接收信號的對象,slog是對信號反應的方法。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class EscapeExample(QtGui.QWidget):

    def __init__(self):
        super(EscapeExample, self).__init__()

        self.setWindowTitle('Escape')
        self.resize(250, 150)

    # 重新實現指定按鈕被按下的事件處理程式
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()


app = QtGui.QApplication(sys.argv)
ex = EscapeExample()
ex.show()
sys.exit(app.exec_())

重新實現了 keyPressEvent() 處理。按下ESC會自動退出。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class SenderExample(QtGui.QMainWindow):

    def __init__(self):
        super(SenderExample, self).__init__()

        self.initUI()

    def initUI(self):

        button1 = QtGui.QPushButton("Button 1", self)
        button1.move(30, 50)

        button2 = QtGui.QPushButton("Button 2", self)
        button2.move(150, 50)

        # 接收到clicked信號時調用buttonClicked
        self.connect(button1, QtCore.SIGNAL('clicked()'),
                     self.buttonClicked)

        self.connect(button2, QtCore.SIGNAL('clicked()'),
                     self.buttonClicked)

        self.statusBar().showMessage('Ready')
        self.setWindowTitle('Event sender')
        self.resize(290, 150)


    def buttonClicked(self):

        sender = self.sender()
        # sender可用來獲取信號源
        self.statusBar().showMessage(sender.text() + ' was pressed')

app = QtGui.QApplication(sys.argv)
ex = SenderExample()
ex.show()
sys.exit(app.exec_())

兩個按鈕都連接了同一個信號,按鈕被按下的時候狀態欄會顯示按鈕的標簽。

自定義信號:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class EmitExample(QtGui.QWidget):

    def __init__(self):
        super(EmitExample, self).__init__()

        self.initUI()

    def initUI(self):

        # 自己創建一個信號,接收後關閉程式
        self.connect(self, QtCore.SIGNAL('closeEmitApp()'),
                     QtCore.SLOT('close()'))

        self.setWindowTitle('emit')
        self.resize(250, 150)


    def mousePressEvent(self, event):
        # 通過 emit() 方法發射信號
        self.emit(QtCore.SIGNAL('closeEmitApp()'))


app = QtGui.QApplication(sys.argv)
ex = EmitExample()
ex.show()
sys.exit(app.exec_())

單擊滑鼠程式會關閉。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • spring有2種類型轉換器,一種是propertyEditor,一種是Converter.雖然都是類型轉換,但是還是有細微差別. 所以這裡以一個例子的形式來分析一下這2種類型轉換的使用場景和差別. 平常的應用中應該有很多這樣的情況,一個po中有一個欄位是status,這個status=0時代表成功
  • Condition 將 Object 監視器方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實現組合使用,為每個對象提供多個等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condi
  • 網路編程模型 課程索引 1. 編程模型 2. 編程模型 Socket的實質就是一個介面 , 利用該介面,用戶在使用不同的網路協議時,操作函數得以統一。 而針對不同協以統一。 而針對不同協議的差異性操作,則交給了 socket去自行解決。 3. TCP編程模型 4. UDP編程模型
  • #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #include <QPixmap> #include <QImage> #include <QScrollArea> class M
  • 1.create a dynamic web project 2.import the needed jar(about 12) 3. request page <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  • #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QRadioButton> #include <QButtonGroup> class MainWindow : public QMainWindow
  • Wordpress 製作theme,導航是一大問題,這篇文章中主要記錄了一些關於wordpress 中有關於導航自定義的一些函數和技巧
  • 之前我們利用java寫了很多東西,但是好像都沒有什麼實際意義。 因為有意義桌面小程式怎麼都得有個界面,可是界面又不太好搞。或者 瞭解到這一層的人就少之又少了。 呀,是不是還得開闢一些版面來介紹awt和 swing。。。 算了 先把這個 雙擊執行的小程式 貢獻出來。 這次 在分享一下源代碼【以前還沒有
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...