Qt官方案例知識點總結(拖放操作——Drag And Drop Robot )

--------------------------------------------------------------------------------------------------------------------------------

QPixmap輪廓剪裁?

?去掉Pixmap的外圍部分,如下:

QPixmap pixmap("./img");
//調用createHeuristicMask(),再調用setMask
pixmap.setMask(pixmap.createHeuristicMask());

效果對比:

?——》

可以看到以圖像內輪廓為邊界線,無關的白色區域被抹去了

---------------------------------------------------------------------------------------------------------------------------------

QGraphicsItem中開啟拖動QDrag

重寫QGraphicsItem的鼠標移動事件,在移動事件中開啟拖動

void ColorItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) {//判斷拖動距離,使用qt推薦的距離QApplication::startDragDistance()if (QLineF(event -> screenPos(), event -> buttonDownScreenPos(Qt::LeftButton)).length() < QApplication::startDragDistance()) {return;}//創建拖動對象QDrag * drag = new QDrag(event -> widget());//創建數據對象,并設置給本次拖動,這樣本次拖動就有數據了QMimeData * mime = new QMimeData;drag -> setMimeData(mime);QImage image(":/images/head.png");mime -> setImageData(image);//可以設置圖像數據mime -> setColorData(color);//顏色數據mime -> setText(QString("#%1%2%3").arg(color.red(), 2, 16, QLatin1Char('0')).arg(color.green(), 2, 16, QLatin1Char('0')).arg(color.blue(), 2, 16, QLatin1Char('0')));//字符串數據QPixmap pixmap(34, 34);pixmap.fill(Qt::white);drag -> setPixmap(pixmap);//設置拖動過程中在鼠標處顯示的圖片drag->setHotSpot(QPoint(15, 20));//設置鼠標在圖片里的位置偏移drag -> exec();//開啟本次拖動
}

qt推薦的拖動距離閾值:QApplication::startDragDistance() ,超過這個距離才啟用拖動

創建的拖動對象(QDrag * drag)可以指定父對象也可以不指定,他會在這次拖動結束時自動釋放,無論這次拖動有沒有被drop接收?

創建的數據對象QMimeData在設置給拖動對象后也不用管他的釋放(drag -> setMimeData(mime);),會跟著拖動對象一起釋放

同時還可以設置鼠標在拖動的過程下面跟隨著圖片drag -> setPixmap(pixmap)

拖動執行函數

Qt::DropAction QDrag::exec(Qt::DropActions supportedActions = Qt::MoveAction)
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions, Qt::DropAction defaultDropAction)

常用的行為就是復制、移動、空操作?

這是一個阻塞函數,

拖動結束后可以獲取到返回值,?來獲取到本次拖動最終執行了什么行為

supportedActions可以指定本次拖動支持的行為

defaultDropAction可以指定本次拖動默認的行為

---------------------------------------------------------------------------------------------------------------------------------

QMimeData攜帶自定義數據

其中QMimeData可以設置自定義的數據,需要繼承重寫或者調用setData方法??

  • 使用setData方法

他的第一個參數是一個字符串,指定數據的類型,可以自己定義

二個參數QByteArray,即要傳輸的數據

比如數據是1個結構體

結構體需要提供轉成QByteArray的方法從QByteArray轉到結構體的方法

// 自定義數據結構
struct Person {QString name;int age;// 序列化到 QByteArrayQByteArray serialize() const {QByteArray data;QDataStream stream(&data, QIODevice::WriteOnly);stream << name << age;return data;}// 從 QByteArray 反序列化static Person deserialize(const QByteArray &data) {QDataStream stream(data);QString name;int age;stream >> name >> age;return {name, age};}
};

創建自定義數據?,指定類型的字符串可以自己隨便寫

// 創建自定義數據
Person person{"Alice", 30};// 序列化并設置到 QMimeData
QMimeData *mimeData = new QMimeData;
mimeData->setData("application/x-custom-person", person.serialize());

接收方解析自定義數據

// 獲取 QMimeData(例如從拖放事件)
const QMimeData *mimeData = event->mimeData();// 檢查是否存在自定義數據
if (mimeData->hasFormat("application/x-custom-person")) {// 提取數據并反序列化QByteArray data = mimeData->data("application/x-custom-person");Person person = Person::deserialize(data);qDebug() << "Received person:" << person.name << person.age;
}
  • 最小子類化QMimeData

即不重寫相關虛函數,直接將數據作為其子類的成員變量,如下

比如把Person傳出去

//自定義數據
struct Person{QString name="11"  ;int age=15;
};//子類化QMimeData,將自定義的類型作為其成員變量
class PersonMimeData: public QMimeData
{
public:Person person;//...還可以攜帶N多數據成員
};

創建自定義的MimeData

//創建自定義的MimeData,并初始化里面自定義的數據,然后設置給QDrag對象
QDrag * drag = new QDrag(event -> widget());
PersonMimeData * mime = new PersonMimeData;
mime -> person = {"May", 18};
drag -> setMimeData(mime);

接受方解析收到的數據

//從事件中獲取mimedata(例如拖放事件),并強轉成對應的類型
PersonMimeData * data = (PersonMimeData * ) event -> mimeData();
//取出內部攜帶的數據
qDebug() << data -> person.name << "   " << data -> person.age;

---------------------------------------------------------------------------------------------------------------------------------

QGraphicsItem中的drop拖放

  • 需要QGraphicsItem接受拖放
setAcceptDrops(true);
  • 需要重寫dragEnterEvent事件,拖動進入事件

可對拖動攜帶數據做一些判斷,判斷是否有想要的數據

需要接受拖動,則需要顯示的調用?event->setAccepted(true),否則后面的拖放事件會收不到數據

void CustomItem::dragEnterEvent(QGraphicsSceneDragDropEvent * event) {//可以對拖過來的數據進行一些判斷,有沒有想要的數據if (event -> mimeData() -> hasColor()) {event -> setAccepted(true); //然后要接受這次拖放,否則后面drop事件無法收到拖放//同時可以改變下item的樣式,isDragging = true; //自己定義的標志變量,標記拖動進入了update();} else {event -> setAccepted(false); //否則拒絕這次拖放}
}
  • 需要重寫拖放事件

主要就是獲取本次拖放的mimeData

設置本次拖放最后采用的行為

void CustomItem::dropEvent(QGraphicsSceneDragDropEvent *event)
{isDragging = false;update();auto data=event->mimeData();//取mimeData里的數據//data->text();...event->setDropAction(Qt::CopyAction);//還可以設置本次拖放最后使用的行為,QDrag的exec函數的返回值就會變成這里設置的
}
  • 需要重寫拖動離開事件

主要就是設置標記變量,表示拖動離開了

同時刷新下樣式

void CustomItem::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) {Q_UNUSED(event);isDragging = false;update();
}

---------------------------------------------------------------------------------------------------------------------------------

并行動畫組QParallelAnimationGroup

可以在動畫組里添加多個動畫,這些動畫可以同時進行

QParallelAnimationGroup * animation = new QParallelAnimationGroup(this);QPropertyAnimation * a1 = new QPropertyAnimation(target1, "rotation");
a1 -> setStartValue(5);
a1 -> setEndValue(-20);
animation -> addAnimation(a1);QPropertyAnimation * a2 = new QPropertyAnimation(target2, "rotation");
a2 -> setStartValue(15);
a2 -> setEndValue(-30);
animation -> addAnimation(a2);
//.....可以添加多個動畫,這些動畫可以同時執行animation -> setLoopCount(-1); //無限循環
animation -> start(); //并行動畫組開啟,多個動畫同時運行

其中animation -> setLoopCount(-1); 參數設置為-1,可讓動畫無限循環

---------------------------------------------------------------------------------------------------------------------------------

正弦動畫曲線

動畫曲線類型QEasingCurve::SineCurve,正弦曲線

可以使動畫1個執行周期內產生一來一回的效果,來和回是完全相反的兩個動畫,如下

其他曲線沒有來回的效果

比如QEasingCurve::OutQuad,如下

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

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

相關文章

【LLM】MOE混合專家大模型綜述(重要模塊原理)

note 當前的 MoE 架構就是一個用顯存換訓練時長/推理延遲的架構MoE 目前的架構基本集中在于將原先 GPT 每層的 FFN 復制多份作為 n 個 expert&#xff0c;并增加一個 router&#xff0c;用來計算每個 token 對應到哪個 FFN&#xff08;一般采用每個 token 固定指派 n 個 exper…

電子病歷高質量語料庫構建方法與架構項目(臨床情景理解模塊篇)

引言 隨著人工智能技術在醫療健康領域的廣泛應用,電子病歷(Electronic Medical Records,EMR)作為臨床醫療數據的重要載體,已成為醫學研究和臨床決策支持的關鍵資源。電子病歷高質量語料庫的構建為醫療人工智能模型的訓練和應用提供了基礎支撐,其中臨床情境理解模塊是連接…

大連理工大學選修課——機器學習筆記(1):概述

機器學習概述 機器學習的本質 機器學習是為了設計解決問題的算法。 為輸入與輸出建立某種映射&#xff1a; 類似于函數關系&#xff1a; Y f ( X ) Yf(X) Yf(X) 不同的映射方法體現了不同的思想。 相關概念 深度學習是機器學習的一個分支 深度學習是深層次化的神經網…

遠程 Debugger 多用戶環境下的用戶隔離實踐

遠程 Debugger 多用戶環境下的用戶隔離實踐 在現代分布式開發和云原生環境下&#xff0c;遠程 Debugger 的應用愈發普遍。然而&#xff0c;隨著多人協作和多租戶場景的出現&#xff0c;**遠程 Debugger 的“用戶隔離”**變得至關重要。只有實現了良好的用戶隔離&#xff0c;才…

畢業論文 | 基于C#開發的NMEA 0183協議上位機

以下是基于C#開發的NMEA 0183協議上位機完整實現方案,包含串口通信、數據解析與可視化功能: 基于C#開發的NMEA 0183協議上位機 一、項目結構二、核心代碼實現1. 數據模型定義2. 串口通信管理3. NMEA協議解析核心4. 主界面實現(Windows Forms)三、界面設計關鍵元素(需在窗體…

Qt -DFS可視化

博客主頁&#xff1a;【夜泉_ly】 本文專欄&#xff1a;【暫無】 歡迎點贊&#x1f44d;收藏?關注?? 目錄 前言關于如何sleep實現思路Pixmapspixmaps.hpixmaps.cpp MapSquaremapsquare.hmapsquare.cpp dfsthreaddfsthread.hdfsthread.cpprun dfs其他 WidgetUnit其他 Qt -DFS…

RHCSA Linux 系統 文件系統權限

1. 文件的一般權限 &#xff08;1&#xff09;文件權限標識解讀 drwxr - xr - x. 12 root root 144 Feb 17 16:51 usr ?d&#xff1a;文件類型&#xff08;d 表示目錄&#xff09; ?rwx&#xff1a;文件所有者權限&#xff08;讀 r&#xff0c;寫 w&#xff0c;執行 x&am…

華為云IoT平臺與MicroPython實戰:從MQTT協議到物聯網設備開發

目錄 前言 1. 華為云 1.1. 創建實例 1.2. 創建產品 1.3. 編輯服務模型 1.4. 注冊設備 1.4.1. 復制設備連接參數 1.5. 連接參考代碼 2. micropython版-物聯網 2.1. 環境搭建 2.2. 實現步驟 2.3. 示例代碼 結語 前言 物聯網&#xff08;IoT&#xff09;技術的快速發…

2025-04-30 AIGC-如何做短片視頻

摘要: 2025-04-30 AIGC-如何做短片視頻 如何做短片視頻: 一、畫圖修圖 1.保存視頻&#xff08;無水保存&#xff09; 2.文案提取&#xff08;提取文案&#xff09; 3. DeepSeek(提示詞&#xff09; 4.小夢Ai&#xff08;圖片視頻&#xff09; 5.修圖Ai 6.擴圖Ai 7.養生…

硬件工程師面試常見問題(10)

第四十六問&#xff1a;鎖存器&#xff0c;觸發器&#xff0c;寄存器三者的區別 觸發器&#xff1a;能夠存儲一位二值信號的基本單元電路統稱為 "觸發器"。&#xff08;單位&#xff09; 鎖存器&#xff1a;一位觸發器只能傳送或存儲一位數據&#xff0c;而在實際工…

外部訪問 Kubernetes 集群中 MQ 服務的方案

外部訪問 Kubernetes 集群中 MQ 服務的方案 當您在 Kubernetes 集群中部署了消息隊列服務&#xff08;如 RabbitMQ、Kafka、ActiveMQ 等&#xff09;后&#xff0c;以下是外部客戶端訪問這些服務的幾種可靠方法&#xff1a; 一、基礎訪問方案 1. NodePort 方式暴露服務 # M…

論文筆記(八十二)Transformers without Normalization

Transformers without Normalization 文章概括Abstract1 引言2 背景&#xff1a;歸一化層3 歸一化層做什么&#xff1f;4 動態 Tanh &#xff08;Dynamic Tanh (DyT)&#xff09;5 實驗6 分析6.1 DyT \text{DyT} DyT 的效率6.2 tanh \text{tanh} tanh 和 α α α 的消融實驗…

軟考中級-軟件設計師 操作系統(手寫筆記)

第一章&#xff1a;基礎知識 第二章&#xff1a;進程管理 狀態轉換圖 進程同步機制 信號量機制 信號量題 死鎖 第三章&#xff1a;存儲管理 基礎知識 分頁存儲管理 分段存儲管理 段頁式存儲管理 頁面置換算法 第四章&#xff1a;文件管理 基礎知識 索引分配 空閑存儲空間的管…

ubuntu 部署moodle

通過地址https://download.moodle.org/releases/latest/選擇下載&#xff0c;下載兩種壓縮包都特別慢&#xff08;有可能無法下載&#xff09;。 可以使用下面git下載項目 注意圖中php、mysql等版本要求&#xff0c;本次采用Ubuntu22.04下 nginxphp8.2mysql8.4部署 mkdir /var…

python實戰項目67:空氣質量在線檢測平臺js逆向

python實戰項目67:空氣質量在線檢測平臺js逆向 一、需求介紹二、完整代碼一、需求介紹 項目需求是獲取某個城市(以北京市為例)歷年(2013年12月至2025年4月)的空氣質量數據,字段包括日期、AQI、質量等級、PM2.5、PM10、NO2、CO、SO2等。改網站的網址是“https://www.aqis…

【Linux】記錄一個有用PS1

PS1 是用來定義shell提示符的環境變量 下面是一個帶有顏色和豐富信息的 Linux PS1 配置示例&#xff0c;包含用戶名、主機名、路徑、時間、Git 分支和退出狀態提示&#xff1a; # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 綠色粗體用戶名 PS…

Python PyTorch庫【機器學習框架】全面深入講解與實踐

一、PyTorch 核心概念 1. 定義與發展背景 PyTorch 是由 Facebook AI Research (FAIR) 開發的開源機器學習框架&#xff0c;2016 年首次發布。其核心特性包括&#xff1a; 動態計算圖&#xff08;Define-by-Run&#xff09;GPU 加速張量計算自動微分系統豐富的神經網絡模塊 …

呼叫中心座席管理系統:智能升級,高效服務

在數字化轉型加速的今天&#xff0c;客戶服務體驗已成為企業競爭力的核心要素。傳統 呼叫中心系統 依賴硬件設備、人工操作的模式已無法滿足高效、智能、靈活的現代企業需求。暢信達呼叫中心 座席管理系統 V5.0應運而生&#xff0c;以WEBRTC軟電話接入、智能座席輔助、知識庫管…

時態--00--總述

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 時態句子結構時態標志詞 時態 句子結構 時態標志詞

算法每日一題 | 入門-順序結構-字母轉換

字母轉換 題目描述 輸入一個小寫字母&#xff0c;輸出其對應的大寫字母。例如輸入 q[回車] 時&#xff0c;會輸出 Q。 輸入格式 無 輸出格式 無 輸入輸出樣例 #1 輸入 #1 q輸出 #1 QC 首先我們要知道&#xff0c;C字符的所有轉換形式都是依照ASCII碼來的。 所以&…