Qt 系統相關 - 1

雖然 Qt 是跨平臺的 C++ 開發框架,Qt 有很多能力其實是操作系統提供的,只不過 Qt 封裝了系統的 API

程序時運行在操作系統上的,需要系統給我們提供支撐!

  1. 事件
  2. 文件操作
  3. 多線程編程
  4. 網絡編程
  5. 多媒體(音頻,視頻)

Qt 事件

事件介紹

信號槽:用戶進行的各種操作可能會產生出信號,我們可以給某個信號指定槽函數,當信號觸發時,就能夠自動的執行到對應的槽函數!

事件也是非常類似的,用戶進行的各種操作,也會產生事件,程序員同樣可以給事件關聯上處理函數(處理的邏輯),當事件觸發的時候,就能夠執行到對應的代碼!

事件本身是操作系統提供的機制,Qt? 也同樣把操作系統事件進行了封裝,拿到了 Qt 中!但是由于事件對應的代碼編寫不是很方便,所以 Qt 對于事件這樣的機制又進行了封裝,就得到了信號槽!

所以事件就是信號槽的底層機制!實際 Qt 開發程序過程中,絕大部分和用戶之間進行的交互是通過“信號槽”來完成的!但是對于有些特殊情況,信號槽不一定能搞定(某個用戶的動作行為,Qt 沒有提供對應的信號...這時候我們就需要通過重寫事件的處理函數的形式,來手動處理事件的響應邏輯)

事件是應用程序內部或者外部產生的事情或者動作的統稱。在 Qt 中使用一個對象來表示一個事件。所有的 Qt 事件均繼承于抽象類 QEvent。事件是由系統或者 Qt 平臺本身在不同的時刻發出的。當用戶按下鼠標、敲下鍵盤,或者是窗口需要重新繪制的時候,都會發出一個相應的事件。一些事件是在用戶操作時發出,如鍵盤事件、鼠標事件等,另一些事件則是由系統本身自動發出,如定時器事件。常見的 Qt 事件如下:

常見事件描述:

事件名稱描述
鼠標事件鼠標左鍵、鼠標右鍵、鼠標滾輪,鼠標的移動,鼠標按鍵的按下和松開
鍵盤事件按鍵類型、按鍵按下、按鍵松開
定時器事件定時時間到達
進入離開事件鼠標的進入和離開
滾輪事件鼠標滾輪滾動
繪屏事件重繪屏幕的某些部分
顯示隱藏事件窗口的顯示和隱藏
移動事件窗口位置的變化
窗口事件是否為當前窗口
大小改變事件窗口大小改變
焦點事件鍵盤焦點移動
拖拽事件用鼠標進行拖拽

事件的處理

讓一段代碼和某一個事件關聯起來,當事件觸發的時候,就能指定到這段代碼

之前信號槽是通過 connect 來完成上述關聯的!對于事件來說,還不太一樣:

事件處理一般常用的方法為:重寫相關的 Event 函數。(用到了面向對象的多態的機制:創建子類,然后繼承自 Qt 中已有的類,在子類中重寫父類的事件處理函數,后續事件出發過程中,就會通過多態這樣的機制,執行到咱們自己寫的子類的函數中!)

在 Qt 中,幾乎所有的 Event 函數都是虛函數,所以可以重新實現。如:在實現鼠標的進入和離開控件時,直接重新實現 enterEvent()leaveEvent() 即可。enterEvent()leaveEvent() 函數原型如下:

[virtual protected] void QWidget::enterEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget enter events which are passed in the event parameter. An event is sent to the widget when the mouse cursor enters the widget.

See also leaveEvent(), mouseMoveEvent(), and event().

[virtual protected] void QWidget::leaveEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget leave events which are passed in the event parameter. A leave event is sent to the widget when the mouse cursor leaves the widget.

See also enterEvent(), mouseMoveEvent(), and event().

示例1:

1. 新建 Qt 項目,基類選擇 QWidget,同時勾選 UI 界面文件,如下圖所示:

2. 設計 ui 文件,如下所示:

3. 在項目中新添加一個類:MyLabel

創建 QLable 子類,重寫 enterEvent 和 leaveEvent!

先選中項目名稱 QEvent,點擊鼠標右鍵,選擇 add new ...,彈出如下對話框:

4. 選擇:Choose ...,彈出如下界面:

5. 此時項目會新增如下兩個文件:

6. 在幫助文檔中查找對應的內容:

7. 點擊“顯示”之后,出現如下內容:

[virtual protected] void QWidget::enterEvent(QEvent *event)

This event handler can be reimplemented in a subclass to receive widget enter events which are passed in the event parameter. An event is sent to the widget when the mouse cursor enters the widget.

See also leaveEvent(), mouseMoveEvent(), and event().

8.?復制 enterEvent() ,粘貼在項??件 "mylabel.h" 中:

9.?重寫 enterEvent() ?法:

10.?在 UI ?件中選中 Label,右鍵 ------> 提升為...

我們直接執行是不行的!

因為當前界面上創建的這個 label 其實是QLabel,不是我們自己寫的 MyLabel!

必須要確保界面上的這個 label 是一個咱們自己定義的 Mylabel 的示例,才會執行到!

11. 當點擊 "提升為... " 之后,彈出如下對話框:

12. 修改基類:

13.?執?效果如下:當?標進?設計好的標簽之后,就會在應?程序輸出欄中打印:?標進?:

示例2:當鼠標點擊時,獲取對應的坐標值

1. 在上述示例的基礎上,在 mylabel.h 中聲明 mousePressEvent() 方法:

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class MyLabel : public QLabel
{Q_OBJECT
public:explicit MyLabel(QWidget *parent = nullptr);// 鼠標進入事件void enterEvent(QEvent *ev);// 鼠標移動事件void mousePressEvent(QMouseEvent *ev);signals:};#endif // MYLABEL_H

2. 在 mylabel.cpp 中重寫 mousePressEvent() 方法:

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
}void MyLabel::enterEvent(QEvent *ev)
{qDebug() << "鼠標進入";
}void MyLabel::mousePressEvent(QMouseEvent *ev)
{// Qt中的格式化字符串QString str1 = QString("鼠標按下了 x = %1, y = %2").arg(ev->x()).arg(ev->y());qDebug() << str1;
}

實現效果如下:

鼠標進入
"鼠標按下了 x = 54, y = 61"
"鼠標按下了 x = 234, y = 15"
"鼠標按下了 x = 393, y = 51"
"鼠標按下了 x = 180, y = 140"
"鼠標按下了 x = 488, y = 146"

示例:鼠標左鍵點擊時,打印對應的坐標值,鼠標右鍵點擊時,打印基于屏幕的坐標

void MyLabel::mousePressEvent(QMouseEvent *ev)
{// 鼠標左鍵if(ev->button() == Qt::LeftButton){// x,y為基于窗口的坐標QString str = QString("鼠標左鍵:x = %1, y = %2").arg(ev->x()).arg(ev->y());qDebug() << str.toUtf8().data();}// 鼠標右鍵if(ev->button() == Qt::RightButton){// globalX,globalY為基于屏幕的坐標QString str = QString("鼠標右鍵:x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << str.toUtf8().data();}
}

按鍵事件

Qt 中的按鍵事件是通過 QKeyEvent 類來實現的。當鍵盤上的按鍵被按下或者被釋放時,鍵盤事件便會觸發。在幫助文檔中查找 QKeyEvent 類如下:

查找按鍵事件中所有的按鍵類型:在幫助?檔中輸?:Qt::Key,如下圖:

單個按鍵事件處理

示例:當某個按鍵被按下時,輸出提示信息:“某個按鍵被按下了”。

1. 新建項目:在項目的頭文件 widget.h 中聲明一個虛函數 keyPressEvent()

2. 在 "widget.cpp" ?件中重寫 keyPressEvent() 虛函數;

組合按鍵

在 Qt 助?中搜索:Qt::KeyboardModifier,如下圖?:

在Qt中,鍵盤事件可以通過Qt::KeyboardModifier枚舉來處理,該枚舉定義了在處理鍵盤事件時對應的修飾鍵。以下是Qt::KeyboardModifier中定義的修飾鍵及其描述:

常量描述
Qt::NoModifier無修改鍵
Qt::ShiftModifierShift 鍵
Qt::ControlModifierCtrl 鍵
Qt::AltModifierAlt 鍵
Qt::MetaModifierMeta鍵(在Windows上指Windows鍵,在macOS上指Command鍵)
Qt::KeypadModifier使用鍵盤上的數字鍵盤進行輸入時,Num Lock鍵處于打開狀態
Qt::GroupSwitchModifier用于在輸入法組之間切換

這些修飾鍵在Qt中可以與鍵盤事件一起使用,以實現一些復雜的交互操作。例如,在處理鍵盤事件時,可以通過檢查這些修飾鍵的狀態來判斷用戶是否同時按下了特定的組合鍵。

示例:

鼠標事件

Qt 中,鼠標事件是用 QMouseEvent 類來實現的。當在窗口中按下鼠標或者移動鼠標時,都會產生鼠標事件。

利用 QMouseEvent 類可以獲取鼠標的哪個鍵被按下了以及鼠標的當前位置等信息。在 Qt 幫助文檔中查找QMouseEvent類 如下圖所示:

鼠標單擊事件

Qt 中,鼠標按下是通過虛函數 mousePressEvent() 來捕獲的。mousePressEvent() 函數原型如下:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

鼠標左右鍵及滾的表示如下:

  • Qt::LeftButton 鼠標左鍵

  • Qt::RightButton 鼠標右鍵

  • Qt::MidButton 鼠標滾輪

示例1:鼠標左鍵

1. 在 "widget.h" 頭文件中聲明鼠標按下事件;

2.?在 "widget.cpp" ?件中重新實現 mousePressEvent() 函數;

實現效果如下:

示例2:鼠標右鍵

實現效果如下:

示例3:鼠標滾輪

實現效果如下:

鼠標釋放事件

鼠標釋放事件是通過虛函數 mouseReleaseEvent() 來捕獲的。mouseReleaseEvent() 函數原型如下:

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

示例:

執行效果如下:

鼠標雙擊事件

鼠標雙擊事件是通過虛函數:mouseDoubleClickEvent() 來實現的。mouseDoubleClickEvent() 函數原型如下:

[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)

示例:鼠標左鍵雙擊

執行效果如下:

鼠標移動事件

鼠標移動事件是通過虛函數:mouseMoveEvent() 來實現的。同時為了實時捕獲鼠標位置信息,需要通過函數 setMouseTracking() 來追蹤鼠標的位置。mouseMoveEvent() 函數原型如下:

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

setMouseTracking() 函數原型如下:

void setMouseTracking(bool enable)

說明

setMouseTracking() 函數默認是 false,需要設置為 true,才能實時捕獲鼠標位置信息。否則只有當鼠標按下時才能捕獲其位置信息。

示例:

執行效果:

滾輪事件

Qt 中,鼠標滾輪事件是通過 QWheelEvent 類來實現的。滾輪滑動的距離可以通過 delta() 函數獲取。delta() 函數原型如下:

int QGraphicsSceneWheelEvent::delta() const

其中返回值代表滾輪滑動的距離。正數表示滾輪相對于用戶向前滑動,負數表示滾輪相對于用戶向后滑動。

示例:

執行效果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“12306”有多牛逼?從架構師的角度詳細的告訴你

12306鐵路票務系統架構深度解析 &#x1f4da; 目錄 系統概述業務特點與技術挑戰整體架構設計核心技術架構高并發處理策略數據存儲與管理緩存體系設計分布式系統架構安全防護體系性能優化策略監控與運維技術演進歷程總結與展望 每到春節、國慶這種全民遷徙的時刻&#xff0c;…

數據采集機器人哪家好?2025 年實測推薦:千里聆 RPA 憑什么成企業首選?

在數字化轉型加速的今天&#xff0c;數據采集已成為企業運營的核心環節&#xff0c;數據采集機器人正在重構企業的效率邊界。2025 年中國 RPA 市場排名顯示&#xff0c;泛微旗下的千里聆 RPA 已躋身行業前五&#xff0c;成為中大型國央企的首選品牌。本文將通過三維評估體系&am…

基礎crud項目(前端部分+總結)

本人根據自己對前端微不足道的理解和 AI 老師的指導下&#xff0c;艱難地完成了基礎crud代碼的全棧開發&#xff0c;算是自己的第一個 Java 項目&#xff0c;對此做個簡單總結。 后端部分 在前后端分離開發中&#xff0c;前端負責頁面交互與數據展示&#xff0c;后端提供接口支…

MATLAB矩陣及其運算(二)函數

函數分為MATLAB內置函數及用戶自定義函數&#xff0c;用戶可以直接調用內置函數進行數據處理。內置函數的使用函數由三部分組成&#xff1a;名稱、輸入和輸出。內置函數示例&#xff1a;單輸入單輸出函數&#xff1a;sqrt(x)&#xff1b;單輸入多輸出函數&#xff1a;size(x)&a…

自動化運維-ansible中對于大項目的管理

自動化運維-ansible中對于大項目的管理 一、引用主機清單 在Playbook中引用主機時&#xff0c;hosts 字段指定的目標必須與Ansible主機清單中定義的標識符完全匹配。如果清單中配置的是主機名&#xff0c;則在Playbook中使用IP地址或其他別名將無法匹配&#xff0c;導致任務被跳…

59_基于深度學習的麥穗計數統計系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

面試問題詳解十六:Qt 內存管理機制

在 Qt 開發過程中&#xff0c;很多初學者&#xff08;包括不少有經驗的 C 程序員&#xff09;經常會產生這樣的疑問&#xff1a;“我在 Qt 中 new 出來的控件好像都沒有 delete&#xff0c;那內存不會泄漏嗎&#xff1f;”比如下面這段代碼&#xff1a; void Widget::createLef…

Pycharm 試用

Ubuntu 重置Pycharm試用期限&#xff08;30 天&#xff09; 先關閉Pycharm刪除系統緩存 rm -rf ~/.config/JetBrains/ && rm -rf ~/.local/share/JetBrains/ && rm -rf ~/.cache/JetBrains/刪除已經安裝的 Pycharm 軟件運行目錄去官網下載新的 就行了

C++ Qt 開發核心知識

Qt 框架概述Qt 是一個跨平臺的 C 應用程序開發框架&#xff0c;廣泛用于開發圖形用戶界面程序。其核心特性包括跨平臺能力、豐富的功能模塊和強大的工具集。核心概念與機制元對象系統Qt 擴展了標準 C&#xff0c;通過元對象系統提供信號與槽機制、運行時類型信息和動態屬性系統…

net9 aspose.cell 自定義公式AbstractCalculationEngine,帶超鏈接excel轉html后背景色丟失

AbstractCalculationEngine 是 Aspose.Cells 中一個強大的抽象類&#xff0c;允許您自定義公式計算邏輯。當您需要覆蓋默認計算行為或實現自定義函數時非常有用。直接上代碼1. 創建自定義計算引擎using Aspose.Cells; using System;// 創建自定義計算引擎 public class CustomC…

如何監控員工的電腦?7款實用的員工電腦管理軟件,探索高效管理捷徑!

當銷售團隊在淘寶刷單、設計師用公司電腦挖礦、程序員頻繁訪問代碼托管網站時&#xff0c;企業損失的不僅是帶寬——低效、泄密、合規風險正成為隱形利潤殺手。 傳統管理依賴“人盯人”或抽查日志&#xff0c;但面對分布式辦公與遠程協作趨勢&#xff0c;這些方法早已力不從心…

機器視覺軟件--VisionPro、Visual Master,Halcon 和 OpenCV 的學習路線

Halcon 和 OpenCV區別 Halcon 和 OpenCV 都是計算機視覺領域的重要工具&#xff0c;但它們的設計理念、功能側重和適用場景有顯著不同。下面這個表格匯總了它們的核心區別&#xff0c;方便你快速了解&#xff1a; 開發模式與體驗??&#xff1a;Halcon 配備了強大的??圖形化…

算法-根據前序+中序遍歷打印樹的右視圖

題目請根據二叉樹的前序遍歷&#xff0c;中序遍歷恢復二叉樹&#xff0c;并打印出二叉樹的右視圖數據范圍&#xff1a; 0≤n≤100000≤n≤10000 要求&#xff1a; 空間復雜度 O(n)O(n)&#xff0c;時間復雜度 O(n)O(n)如輸入[1,2,4,5,3],[4,2,5,1,3]時&#xff0c;通過前序遍歷…

Kafka面試精講 Day 7:消息序列化與壓縮策略

【Kafka面試精講 Day 7】消息序列化與壓縮策略 在Kafka的高性能消息系統中&#xff0c;消息序列化與壓縮是影響吞吐量、延遲和網絡開銷的核心環節。作為“Kafka面試精講”系列的第7天&#xff0c;本文聚焦于這一關鍵主題&#xff0c;深入剖析其原理、實現方式、配置策略及常見…

Xterminal軟件下載_Xterminal ssh遠程鏈接工具下載__Xterminal安裝包 網盤下載_Xterminal ssh遠程鏈接工具安裝包

Xterminal 作為一款國產 SSH 工具&#xff0c;專為開發人員量身打造。它支持 SSH 和 Telnet 協議連接遠程服務器與虛擬機&#xff0c;無論是進行代碼部署&#xff0c;還是服務器運維&#xff0c;都能輕松勝任。軟件界面采用極簡設計&#xff0c;黑色背景搭配白色文字&#xff0…

Lua > 洛谷

Lua > 洛谷P1000 超級瑪麗游戲P1001 AB ProblemP1008 [NOIP 1998 普及組] 三連擊P1035 [NOIP 2002 普及組] 級數求和P1046 [NOIP 2005 普及組] 陶陶摘蘋果P1047 [NOIP 2005 普及組] 校門外的樹P1085 [NOIP 2004 普及組] 不高興的津津P1089 [NOIP 2004 提高組] 津津的儲蓄計劃…

小企業環境-火山方舟和扣子

背景說明 并不是說應該怎么辦&#xff0c;而是基本配置有這些可以進行使用&#xff0c;具體不同企業使用的時候肯定要個性化配置。 使用了火山方舟和扣子 火山方舟 應用實驗室列表 簡單使用了提示詞的功能&#xff0c;后端服務ARK_API_KEY 應用ID 來對應請求發送http請求…

QT-事件

Qt事件 除了信號和槽通信機制外&#xff0c;Qt中還提供了事件處理機制實現與用戶的交互和對象間的通信。Qt捕獲底層操作系統消息&#xff0c;進行封裝之后轉換為Qt事件&#xff0c;事件處理后才發出信號。 一、事件概述Qt中事件是程序內部或外部發生的動作。比如程序外部&#…

HI3519DRFCV500/HI3519DV500海思核心板IPC算力2.5T圖像ISP超高清智能視覺應用提供SDK軟件開發包

Hi3519DV500是一顆面向視覺行業推出的超高清智能 SoC。最高支持四路sensor輸入&#xff0c;支持最高4K30fps的ISP圖像處理能力&#xff0c;支持 2F WDR、多級降噪、六軸防抖、全景拼接、多光 譜融合等多種傳統圖像增強和處理算法&#xff0c;支持通過AI算法對輸入圖像進行實時降…

go 初始化組件最佳實踐

Go 語言初始化最佳實踐 在 Go 語言中, 有一個 init() 函數可以對程序進行包級別的初始化, 但 init() 函數有諸多不便, 例如: 無法返回錯誤, 進行耗時初始化時, 會增加程序啟動時間。因此 init() 函數并不適用于所有初始化。 1.初始化方式 在程序進行初始化時&#xff0c;我們應…