lv20 QT事件5

1 事件模型

2 事件處理

virtual void 	keyPressEvent(QKeyEvent *event)
virtual void 	keyReleaseEvent(QKeyEvent *event)
virtual void 	mouseDoubleClickEvent(QMouseEvent *event)
virtual void 	mouseMoveEvent(QMouseEvent *event)
virtual void 	mousePressEvent(QMouseEvent *event)
virtual void 	mouseReleaseEvent(QMouseEvent *event)
virtual void 	moveEvent(QMoveEvent *event)
virtual void 	paintEvent(QPaintEvent *event)
virtual void 	resizeEvent(QResizeEvent *event)
virtual void 	wheelEvent(QWheelEvent *event)

2.1 事件綜合示例

  • mousePressEvent:處理鼠標按下事件,輸出鼠標位置信息。
  • mouseMoveEvent:處理鼠標移動事件,輸出鼠標位置信息。
  • keyPressEvent:處理鍵盤按下事件,輸出按下的鍵值。
  • wheelEvent:處理鼠標滾輪事件,輸出滾輪滾動距離。
  • timerEvent:處理定時器事件,輸出定時器事件信息。

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QWheelEvent>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();void mousePressEvent(QMouseEvent *event){qDebug()<<"pressssss: "<<event->pos();}void mouseMoveEvent(QMouseEvent *event){qDebug()<<"moving!"<<event->pos();}void keyPressEvent(QKeyEvent *event){qDebug()<<"key: "<<event->key();}void wheelEvent(QWheelEvent *event){qDebug()<<"wheel: "<<event->delta();}void timerEvent(QTimerEvent *event){qDebug()<<"timer!";}
};#endif // WIDGET_H

widget.cpp

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{startTimer(1000);
}Widget::~Widget()
{}

2.2 繪圖事件

virtual void paintEvent(QPaintEvent *event)
{?if(isDrawing)??{??tempPix?=?pix;???????//雙緩沖?????QPainter?pp(&tempPix);??painter.drawPixmap(0,0,tempPix);??}??else?{??QPainter?pp(&pix);??painter.drawPixmap(0,0,pix);??}??
}

繪制時鐘示例?

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QPainter>class Widget : public QWidget
{Q_OBJECT  // 使用 Q_OBJECT 宏,以便能夠使用 Qt 的信號和槽機制public:Widget(QWidget *parent = 0);  // 構造函數~Widget();  // 析構函數void paintEvent(QPaintEvent *event)  // 重載 paintEvent 方法,用于繪制圖形{qDebug()<<"ppppppp";  // 輸出調試信息QPainter p(this);  // 創建 QPainter 對象并將當前窗口部件作為繪圖設備p.translate(this->width()/2, this->height()/2);  // 將坐標系平移到窗口中心p.drawEllipse(QPoint(0, 0), 100, 100);  // 繪制橢圓// p.drawLine(0, 0, 50, 50);  // 注釋掉的代碼,不會被執行p.rotate(i++*10);  // 旋轉坐標系p.drawLine(0, 0, 50, 50);  // 繪制旋轉后的線條}void timerEvent(QTimerEvent *event)  // 重載 timerEvent 方法,處理定時器事件{update();  // 更新界面}private:int i;  // 用于記錄旋轉角度的變量
};#endif // WIDGET_H

widget.cpp

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{i = 0;startTimer(1000);
}Widget::~Widget()
{}

效果

示例2

用于實現一個簡單的畫板功能。用戶可以在窗口上按下鼠標左鍵開始繪制線條,拖動鼠標繪制線條,松開鼠標左鍵結束繪制。

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMouseEvent>
#include <QPainter>class Widget : public QWidget
{Q_OBJECT  // 使用 Q_OBJECT 宏,以便能夠使用 Qt 的信號和槽機制public:Widget(QWidget *parent = 0);  // 構造函數~Widget();  // 析構函數void mousePressEvent(QMouseEvent *event)  // 處理鼠標按下事件{startp = event->pos();  // 記錄鼠標按下時的位置}void mouseReleaseEvent(QMouseEvent *event)  // 處理鼠標釋放事件{saveit = true;  // 標記需要保存當前繪制的線條update();  // 更新界面}void mouseMoveEvent(QMouseEvent *event)  // 處理鼠標移動事件{endp = event->pos();  // 記錄鼠標移動時的位置update();  // 更新界面}void paintEvent(QPaintEvent *event)  // 重載 paintEvent 方法,用于繪制圖形{if(saveit){QPainter px(pix);  // 創建一個新的 QPainter 對象px.drawLine(startp, endp);  // 在 QPixmap 對象上繪制線條,否則下一個線條會消失saveit = false;  // 將保存標志復位}QPainter p(this);  // 創建一個 QPainter 對象,繪制到當前窗口部件上p.drawPixmap(0, 0, *pix);  // 將 QPixmap 對象繪制到窗口上p.drawLine(startp, endp);  // 實時顯示當前繪制的線條}private:QPoint startp;  // 起始點坐標QPoint endp;  // 終點坐標QPixmap *pix;  // 用于保存繪制內容的 QPixmap 對象bool saveit;  // 標志是否需要保存當前繪制的線條
};#endif // WIDGET_H

widget.cpp?

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{//創建了一個與窗口大小相同的 QPixmap 對象,并將其填充為白色背景。同時,將保存標志 saveit 初始化為 falsepix = new QPixmap(this->width(), this->height());pix->fill();saveit = false;
}Widget::~Widget()
{}

?

3 事件過濾

class A:public Qobject{
};class B:public Qobject{
Public:bool eventFilter(Qobject *sender, Qevent *event){return QObject::eventFilter(obj, event); }
};
A x;
B y;
x.installeventfilter(&y);

事件示例

一個事件,如先進過快捷鍵,后經過按鈕。最終效果鍵盤可以切換圖片,按鈕也可以切換

widget.h?

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QFileDialog>
#include <QStringList>
#include <QEvent>
#include <QKeyEvent>class Widget : public QWidget
{Q_OBJECT // 使用 Q_OBJECT 宏,以便能夠使用 Qt 的信號和槽機制
public slots:void openfiles() // 打開圖片文件槽函數{index = 0; // 初始化索引為0files = QFileDialog::getOpenFileNames(); // 獲取選擇的圖片文件列表QPixmap pix(files[index]); // 加載第一張圖片lb->setPixmap(pix); // 在 QLabel 上顯示圖片}void showr() // 顯示下一張圖片槽函數{if(index+1 < files.length()) // 判斷是否還有下一張圖片index++;elseindex = 0; // 循環顯示圖片QPixmap pix(files[index]); // 加載指定索引的圖片lb->setPixmap(pix); // 在 QLabel 上顯示圖片}void showl() // 顯示上一張圖片槽函數{if(index-1 >= 0) // 判斷是否還有上一張圖片index--;elseindex = files.length()-1; // 循環顯示圖片QPixmap pix(files[index]); // 加載指定索引的圖片lb->setPixmap(pix); // 在 QLabel 上顯示圖片}bool eventFilter(QObject *watched, QEvent *event) // 事件過濾器函數{lb->setFocus(); // 設置 QLabel 獲得焦點if(watched == lb) // 如果事件源是 QLabel{if(event->type() == QEvent::KeyPress) // 如果是鍵盤按鍵事件{QKeyEvent *keyevent = static_cast<QKeyEvent*>(event); // 將事件轉換為鍵盤事件if(keyevent->key() == Qt::Key_Left) // 如果按下左箭頭鍵showl(); // 顯示上一張圖片else if(keyevent->key() == Qt::Key_Right) // 如果按下右箭頭鍵showr(); // 顯示下一張圖片return true; // 返回 true 表示事件已處理}}return QWidget::eventFilter(watched, event); // 其他情況交給父類處理}
public:Widget(QWidget *parent = 0); // 構造函數~Widget(); // 析構函數
private:QLabel *lb; // 顯示圖片的 QLabel 對象QPushButton *lbt, *rbt, *openbt; // 左右切換和打開文件的按鈕QStringList files; // 存儲打開的圖片文件列表int index; // 當前顯示圖片的索引
};#endif // WIDGET_H

widget.cpp

Widget::Widget(QWidget *parent): QWidget(parent)
{// 創建 QLabel 控件,并設置大小、縮放內容以及獲取焦點lb = new QLabel;lb->setMinimumSize(640, 480);lb->setScaledContents(true);lb->setFocus();lb->installEventFilter(this); // 安裝事件過濾器,用于處理鍵盤事件// 創建左右切換和打開文件的按鈕,并添加到水平布局中lbt = new QPushButton("<");rbt = new QPushButton(">");openbt = new QPushButton("open");QHBoxLayout *hbox = new QHBoxLayout;hbox->addStretch();hbox->addWidget(lbt);hbox->addWidget(openbt);hbox->addWidget(rbt);hbox->addStretch();// 創建垂直布局,將 QLabel 和水平布局添加到其中,并設置為 Widget 的布局QVBoxLayout *vbox = new QVBoxLayout;vbox->addWidget(lb);vbox->addLayout(hbox);setLayout(vbox);index = 0; // 初始化索引為0// 連接按鈕的點擊信號與槽函數connect(openbt, SIGNAL(clicked(bool)), this, SLOT(openfiles())); // 打開文件按鈕connect(lbt, SIGNAL(clicked(bool)), this, SLOT(showl())); // 左箭頭按鈕connect(rbt, SIGNAL(clicked(bool)), this, SLOT(showr())); // 右箭頭按鈕
}Widget::~Widget()
{// 析構函數為空,因為 Qt 會自動管理對象的內存釋放
}

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

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

相關文章

【短時交通流量預測】基于Elman神經網絡

課題名稱&#xff1a;基于Elman神經網絡的短時交通流量預測 版本時間&#xff1a;2023-04-27 代碼獲取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主獲取 模型簡介&#xff1a; 城市交通路網中交通路段上某時刻的交通流量與本路段前幾個時段的交通流量有關&#…

自己拍攝的視頻能做成二維碼嗎?快速在線生碼該怎么操作?

自己拍攝的視頻能做成二維碼嗎&#xff1f;現在掃描二維碼用來播放視頻的使用場景越來越多&#xff0c;這種方式的流行在于能夠通過更低的成本獲取更好的效果&#xff0c;有效的提升用戶獲取視頻內容的體驗&#xff0c;通過消耗流量就可以播放視頻。 那么視頻制作二維碼一般會…

vue2 vue-router源碼解析

目錄 Vue Router 的基本結構和功能 源碼分析 一. 編寫install 方法 二 .生命變量存儲路由信息和當前路由 三 .初始化路由 把路由信息記錄在routeMap中 四.注冊router-link 和router-view 組件 Vue Router 的基本結構和功能 路由器實例&#xff08;Router 實例&#xff09;…

Vue.js 修飾符:精準控制組件行為

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 &#x1f35a; 藍橋云課簽約作者、上架課程《Vue.js 和 E…

多點通信與域套接字:2024/3/4

作業1&#xff1a;廣播 發送端&#xff1a; #include <myhead.h> int main(int argc, const char *argv[]) {//1.創建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}printf("sfd%d\n",sfd);//2.設置當前…

藍橋杯復習之前綴和

題目鏈接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到區間和&#xff0c;第一反應肯定是前綴和&#xff0c;我們求出前綴和后對前綴和數組每一個值模k&#xff0c;然后對一個數組的值查看前面有幾個相同的&#xff0c;舉個例子&#xff1a;…

【python 常見錯誤】

標題【python 常見錯誤】 一、python 常見錯誤 Python編程過程中&#xff0c;開發者可能會遇到多種類型的錯誤。這些錯誤大致可以分為三類&#xff1a;語法錯誤&#xff08;SyntaxError&#xff09;、邏輯錯誤和運行時錯誤。下面將詳細介紹這幾種錯誤類型&#xff0c;并提供相…

【動態規劃】第十一屆藍橋杯省賽第二場C++ C組《數字三角形》(c++)

1.題目描述 上圖給出了一個數字三角形。 從三角形的頂部到底部有很多條不同的路徑。 對于每條路徑&#xff0c;把路徑上面的數加起來可以得到一個和&#xff0c;你的任務就是找到最大的和。 路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右邊的那個數。 …

Pytorch學習 day03(Tensorboard)

Tensorboard Tensorboard能夠可視化loss的變化過程&#xff0c;便于我們查看模型的訓練狀態&#xff0c;也能查看模型當前的輸入和輸出結果 在Pycharm中&#xff0c;可以通過按住ctrl&#xff0c;并左鍵點擊某個庫來進入源文件查看該庫的使用方法 SummaryWriter是用來向log_di…

3分鐘,學會一個測試員必懂 Lambda 小知識!

今天再來給大家介紹下函數式接口和方法引用。 函數式接口 問&#xff1a;Lambda 表達式的類型是什么&#xff1f; 答&#xff1a;函數式接口 問&#xff1a;函數式接口是什么&#xff1f; 答&#xff1a;只包含一個抽象方法的接口&#xff0c;稱為函數式接口 &#xff08;…

Linux服務器磁盤及內存用量監控Python腳本(推送釘釘群通知)

文章目錄 Python 腳本釘釘推送通知定時任務 Python 腳本 # -*- coding: utf-8 -*- import subprocessdef get_disk_usage():# 執行 df 命令獲取磁盤使用情況df_process subprocess.Popen([df, -h, /], stdoutsubprocess.PIPE)output, _ df_process.communicate()output out…

Lua 篇(一)— 安裝運行Hello World

目錄 前言一、Lua 是什么&#xff1f;二、Lua和C#的區別三、安裝 LuaLinux 系統上安裝Mac OS X 系統上安裝Window 系統上安裝emmyluaRider 安裝(推薦) 四、Lua學習資料 前言 Lua 是一種輕量級的嵌入式腳本語言&#xff0c;它可以與 C 語言無縫集成&#xff0c;提供了強大的編程…

YOLOv6-Openvino和ONNXRuntime推理【CPU】

1 環境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安裝Openvino和ONNXRuntime 2.1 Openvino簡介 Openvino是由Intel開發的專門用于優化和部署人工智能推理的半開源的工具包&#xff0c;主要用于對深度推理做優化。 Openvino內部集成了Opencv、Tens…

庫函數和頭文件

難道要求平方根也要自己寫一個&#xff1f; #include<iostream> #include<cmath>//頭文件<cmath>中包含許多數學庫函數 using namespace std; int main() {double a;cin>>a;if(a<0) {cout<<"Illegal input"<<endl;return 0;…

PHP語言常見面試題:在PHP中,如何聲明變量?變量的作用域是什么?

在PHP中&#xff0c;聲明變量非常直接和簡單。您只需要在變量名前加上$符號&#xff0c;然后為其分配一個值。這里有一個基本的例子&#xff1a; php復制代碼 <?php $variableName "Hello, World!"; // 聲明一個名為 $variableName 的變量&#xff0c;并賦值為…

DataGrip 2023:讓數據庫開發變得更簡單、更高效 mac/win

JetBrains DataGrip 2023是一款功能強大的數據庫IDE&#xff0c;專為數據庫開發和管理而設計。通過DataGrip&#xff0c;您可以連接到各種關系型數據庫管理系統(RDBMS)&#xff0c;并使用其提供的一組工具來查詢、管理、編輯和開發數據庫。 DataGrip 2023軟件獲取 DataGrip 2…

前端學習第七天-css常用樣式設置

達標要求 掌握元素的顯示與隱藏 熟練應用溢出的文字隱藏 熟練掌握版心和布局流程 1. 元素的顯示與隱藏 在CSS中有三個顯示和隱藏的單詞比較常見&#xff0c;我們要區分開&#xff0c;他們分別是 display visibility 和 overflow。 他們的主要目的是讓一個元素在頁面中消失…

94、利用多線程優化卷積運算

上一節簡單介紹了多線程的概念,同時也介紹了在使用多線程編程時,對于數據在線程間的切分,應該遵循的一個原則:那就是切分獨立的數據快,而不切分有數據依賴的數據塊。 最后還拋出了一個問題:對于卷積算法而言,你覺的切分哪個維度最合適呢? 卷積的切分 之前花了很多篇幅…

數據結構從入門到精通——鏈表

鏈表 前言一、鏈表1.1 鏈表的概念及結構1.2 鏈表的分類1.3 鏈表的實現1.4 鏈表面試題1.5 雙向鏈表的實現 二、順序表和鏈表的區別三、單項鏈表實現具體代碼text.htext.cmain.c單鏈表的打印空間的開辟鏈表的頭插、尾插鏈表的頭刪、尾刪鏈表中元素的查找鏈表在指定位置之前、之后…

LabVIEW齒輪傳動健康狀態靜電在線監測

LabVIEW齒輪傳動健康狀態靜電在線監測 隨著工業自動化的不斷發展&#xff0c;齒輪傳動作為最常見的機械傳動方式之一&#xff0c;在各種機械設備中發揮著至關重要的作用。然而&#xff0c;齒輪在長期運行過程中易受到磨損、變形等因素影響&#xff0c;進而影響整個機械系統的穩…