03.05 QT事件

實現一個繪圖工具,具備以下功能:

  • 鼠標繪制線條。

  • 實時調整線條顏色和粗細。

  • 橡皮擦功能,覆蓋繪制內容。

  • 撤銷功能,ctrl + z 快捷鍵撤銷最后一筆

程序代碼:
<1> Widget.h:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>
#include <QLine>
#include <QVector>
#include <QColorDialog>
#include <QPair>
#include <QKeyEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QPoint start;QPoint end;QVector<QVector<QPair<QLine, QPair<QColor, int>>>> strokes; // 存儲每一筆的所有線段QVector<QPair<QLine, QPair<QColor, int>>> currentStroke;    // 當前正在繪制的一筆QColor currentColor = Qt::black;                            // 當前顏色int currentWidth = 1;                                        // 當前線條粗細bool isEraserMode = false;                                   // 是否為橡皮擦模式protected:virtual void paintEvent(QPaintEvent *event) override;virtual void mouseMoveEvent(QMouseEvent *event) override;virtual void mousePressEvent(QMouseEvent *event) override;virtual void mouseReleaseEvent(QMouseEvent *event) override;virtual void keyPressEvent(QKeyEvent *event) override; // 鍵盤事件處理private slots:void on_pushButton_clicked(); // 調色板void on_pushButton_2_clicked(); // 1mmvoid on_pushButton_3_clicked(); // 5mmvoid on_pushButton_4_clicked(); // 10mmvoid on_pushButton_6_clicked(); // 20mmvoid on_pushButton_5_clicked(); // 橡皮擦
};
#endif // WIDGET_H
<2> Widget.cpp:
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setPalette(QPalette(Qt::white)); // 設置窗口背景色為白色setAutoFillBackground(true);     // 自動填充背景
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPen pen;// 遍歷所有筆觸,繪制每一筆for (const auto &stroke : strokes) {for (const auto &linePair : stroke) {pen.setColor(linePair.second.first); // 設置線條顏色pen.setWidth(linePair.second.second); // 設置線條粗細painter.setPen(pen);painter.drawLine(linePair.first); // 繪制線條}}// 繪制當前正在繪制的一筆for (const auto &linePair : currentStroke) {pen.setColor(linePair.second.first); // 設置線條顏色pen.setWidth(linePair.second.second); // 設置線條粗細painter.setPen(pen);painter.drawLine(linePair.first); // 繪制線條}
}void Widget::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() & Qt::LeftButton) {end = event->pos();QLine line(start, end);// 如果是橡皮擦模式,使用背景色繪制if (isEraserMode) {QColor backgroundColor = palette().color(QPalette::Window); // 獲取窗口背景色currentStroke << qMakePair(line, qMakePair(backgroundColor, currentWidth)); // 使用背景色覆蓋} else {currentStroke << qMakePair(line, qMakePair(currentColor, currentWidth)); // 正常繪制}start = end;update(); // 觸發重繪}
}void Widget::mousePressEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {start = event->pos(); // 記錄起點currentStroke.clear(); // 開始新的一筆}
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{if (event->button() == Qt::LeftButton) {end = event->pos();QLine line(start, end);// 如果是橡皮擦模式,使用背景色繪制if (isEraserMode) {QColor backgroundColor = palette().color(QPalette::Window); // 獲取窗口背景色currentStroke << qMakePair(line, qMakePair(backgroundColor, currentWidth)); // 使用背景色覆蓋} else {currentStroke << qMakePair(line, qMakePair(currentColor, currentWidth)); // 正常繪制}strokes << currentStroke; // 將當前一筆添加到所有筆觸中currentStroke.clear(); // 清空當前一筆update(); // 觸發重繪}
}// 鍵盤事件處理
void Widget::keyPressEvent(QKeyEvent *event)
{// 檢測 Ctrl + Z 按鍵組合if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z) {if (!strokes.isEmpty()) {strokes.removeLast(); // 移除最后一整筆update(); // 觸發重繪}}
}// 打開調色板
void Widget::on_pushButton_clicked()
{currentColor = QColorDialog::getColor(currentColor, this, "選擇顏色");
}void Widget::on_pushButton_2_clicked()
{currentWidth = 1; // 設置線條粗細為 1
}void Widget::on_pushButton_3_clicked()
{currentWidth = 5; // 設置線條粗細為 5
}void Widget::on_pushButton_4_clicked()
{currentWidth = 10; // 設置線條粗細為 10
}void Widget::on_pushButton_6_clicked()
{currentWidth = 20; // 設置線條粗細為 20
}// 切換橡皮擦模式
void Widget::on_pushButton_5_clicked()
{isEraserMode = !isEraserMode; // 切換橡皮擦模式if (isEraserMode) {ui->pushButton_5->setText("繪圖模式"); // 更新按鈕文本} else {ui->pushButton_5->setText("橡皮擦"); // 更新按鈕文本}
}
<3> main.cpp:
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

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

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

相關文章

【文生圖】windows 部署stable-diffusion-webui

windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 帶圖片的詳細功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…

go語言因為前端跨域導致無法訪問到后端解決方案

前端服務8080訪問后端8081這端口顯示跨域了 ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/A…

hive之lag函數

從博客上發現兩個面試題&#xff0c;其中有個用到了lag函數。整理學習 LAG 函數是 Hive 中常用的窗口函數&#xff0c;用于訪問同一分區內 前一行&#xff08;或前 N 行&#xff09;的數據。它在分析時間序列數據、計算相鄰記錄差異等場景中非常有用。 一、語法 LAG(column,…

【軟考-架構】1.3、磁盤-輸入輸出技術-總線

GitHub地址&#xff1a;https://github.com/tyronczt/system_architect ?資料&文章更新? 文章目錄 存儲系統&#x1f4af;考試真題輸入輸出技術&#x1f4af;考試真題第一題第二題 存儲系統 尋道時間是指磁頭移動到磁道所需的時間&#xff1b; 等待時間為等待讀寫的扇區…

盛鉑科技PDROUxxxx系列鎖相介質振蕩器(點頻源):高精度信號源

——超低相位噪聲、寬頻覆蓋、靈活集成&#xff0c;賦能下一代射頻系統 核心價值&#xff1a;以突破性技術解決行業痛點 在雷達、衛星通信、高速數據采集等高端射頻系統中&#xff0c;信號源的相位噪聲、頻率穩定度及集成靈活性直接決定系統性能上限。盛鉑科技PDROUxxxx系列鎖…

【安裝】SQL Server 2005 安裝及安裝包

安裝包 SQLEXPR.EXE&#xff1a;SQL Server 服務SQLServer2005_SSMSEE.msi&#xff1a;數據庫管理工具&#xff0c;可以創建數據庫&#xff0c;執行腳本等。SQLServer2005_SSMSEE_x64.msi&#xff1a;同上。這個是 64 位操作系統。 下載地址 https://www.microsoft.com/zh-c…

【文獻閱讀】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

這篇文章發表于2024年4月 摘要 大語言模型&#xff08;LLMs&#xff09;的快速發展推動了多個領域的變革&#xff0c;重塑了通用人工智能的格局。然而&#xff0c;這些模型不斷增長的計算和內存需求帶來了巨大挑戰&#xff0c;阻礙了學術研究和實際應用。為解決這些問題&…

如何在Github上面上傳本地文件夾

前言 直接在GitHub網址上面上傳文件夾是不行的&#xff0c;需要一層一層創建然后上傳&#xff0c;而且文件的大小也有限制&#xff0c;使用Git進行上傳更加方便和實用 1.下載和安裝Git Git - Downloads 傻瓜式安裝即可 2.獲取密鑰對 打開自己的Github&#xff0c;創建SSH密鑰&…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常運維工作中&#xff0c;采用cli的方式進行kafka集群的管理&#xff0c;還是比較繁瑣的(指令復雜&#xff1f;)。為方便管理&#xff0c;可以選擇一些開源的webui工具。 推薦使用cmak。 二. 關于cmak&#xff1a; cmak是 Yahoo 貢獻的一款強大的 Apac…

python之爬蟲入門實例

鏈家二手房數據抓取與Excel存儲 目錄 開發環境準備爬蟲流程分析核心代碼實現關鍵命令詳解進階優化方案注意事項與擴展 一、開發環境準備 1.1 必要組件安裝 # 安裝核心庫 pip install requests beautifulsoup4 openpyxl pandas# 各庫作用說明&#xff1a; - requests&#x…

Redis的CPU高達90%時如何處理

Redis的CPU高達90%時如何處理 1. 分析和優化2. 擴展和分片3. 緩存策略調整4. 資源提升5. 負載均衡6. 進程調整7. 代碼層面改進8. 其他 當Redis的CPU使用率高達90%時&#xff0c;說明Redis服務器可能處于過載狀態&#xff0c;這可能會導致響應時間變長甚至服務中斷。要處理這種…

Faster R-CNN 算法詳解

Faster R-CNN 是在 R-CNN 和 Fast R-CNN 的基礎上進一步優化的一種目標檢測算法。它通過引入 Region Proposal Network (RPN) 將區域建議和目標檢測整合到一個統一的框架中,大幅提高了檢測效率。以下是對 Faster R-CNN 算法的詳細解析: 1. 概述 Faster R-CNN 主要由三部分組…

數據結構:八大排序(冒泡,堆,插入,選擇,希爾,快排,歸并,計數)詳解

目錄 一.冒泡排序 二.堆排序 三.插入排序 四.選擇排序 五.希爾排序 六.快速排序 1.Lomuto版本&#xff08;前后指針法&#xff09; 2.Lomuto版本的非遞歸算法 3.hoare版本&#xff08;左右指針法&#xff09; 4.挖坑法找分界值&#xff1a; 七.歸并排序 八.計數排序…

【商城實戰(2)】商城架構設計:從底層邏輯到技術實現

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

Mac mini M4安裝nvm 和node

先要安裝Homebrew&#xff08;如果尚未安裝&#xff09;。在終端中輸入以下命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 根據提示操作完成Homebrew的安裝。 安裝nvm。在終端中輸入以下命令&#xf…

FOC無感開環啟動算法

FOC無感開環啟動排除掉高頻注入這種直接識別當前轉子dq軸的位置直接閉環啟動&#xff0c;大部分的常規啟動方式就是三段式啟動&#xff0c;對齊-強拖-觀測器介入-觀測器誤差穩定后平滑過渡-閉環。 這里就只寫出I/F&#xff08;V/F&#xff09;啟動的角度輸出的代碼&#xff0c…

Android 自定義View 加 lifecycle 簡單使用

前言 本文是自定義view中最簡單的使用方法&#xff0c;分別進行 ‘onMeasure’、‘onDraw’、‘自定義樣式’、‘lifecycle’的簡單使用&#xff0c;了解自定義view的使用。 通過lifecycle來控制 動畫的狀態 一、onMeasure做了什么&#xff1f; 在onMeasure中獲取view 的寬和…

《挑戰你的控制力!開源小游戲“保持平衡”開發解析:用HTML+JS+CSS實現物理平衡挑戰》?

&#x1f4cc; 大家好&#xff0c;我是智界工具庫&#xff0c;致力于分享好用實用且智能的軟件以及在JAVA語言開發中遇到的問題&#xff0c;如果本篇文章對你有所幫助請幫我點個小贊小收藏吧&#xff0c;謝謝喲&#xff01;&#x1f618;&#x1f618;&#x1f618; 博主聲…

淺淺初識AI、AI大模型、AGI

前記&#xff1a;這里只是簡單了解&#xff0c;后面有時間會專門來擴展和深入。 當前&#xff0c;人工智能&#xff08;AI&#xff09;及其細分領域&#xff08;如AI算法工程師、自然語言處理NLP、通用人工智能AGI&#xff09;的就業前景呈現高速增長態勢&#xff0c;市場需求…

服務器時間同步

方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服務器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多個 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…