C++ 作業 DAY5

作業

代碼

Widtget.h

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;/************************ 起始終止坐標 ************************/QPoint end;QPoint start;QVector<QPoint> per_start_list;   //容器 記錄每一次鼠標按下的start/************************ 畫筆相關 ************************/QPainter painter;   //繪畫QPen pen;           //畫筆/************************ 移動軌跡line ************************/struct line_attr{QLine line;                 //線長QColor color = Qt::black;   //顏色int width = 1;              //粗細}line_attr_temp;    //line屬性bool rubber_in_use=0;               //橡皮擦標志位:0未用 1使用QVector<line_attr> lines_attr;      //容器 記錄每一個move時 line的屬性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();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();
};
#endif // WIDGET_H

Widget.cpp

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}/**************** 繪畫邏輯 ****************/
void Widget::paintEvent(QPaintEvent *event)
{painter.begin(this);for(auto perline:lines_attr){pen.setColor(perline.color);pen.setWidth(perline.width);painter.setPen(pen);painter.drawLine(perline.line);}painter.end();
}/**************** 鼠標邏輯 ****************/
void Widget::mouseMoveEvent(QMouseEvent *event)
{end = event->pos();         //獲取鼠標最后位置QLine line(start,end);      //生成小lineline_attr_temp.line = line; //結構體line成員屬性//置此,line_attr_temp所有屬性獲取完畢lines_attr.append(line_attr_temp);  //放到容器start = end;    //更新startupdate();
}void Widget::mousePressEvent(QMouseEvent *event)
{start = event->pos();per_start_list << start;
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{end = event->pos();// 檢查:如果鼠標沒有移動if(per_start_list.last()==end){//則刪除剛剛 鼠標按下 時記錄的startper_start_list.removeLast();}
}
/*
錯誤現象:畫線后,空點一次,再使用撤銷,會出現段錯誤
錯誤原因:空點時,起始坐標start 放入容器中,但是沒有產生線段,撤銷時的判斷 "" 永遠無法達到,會一直刪除最后一個,直到段錯誤
錯誤解決:如果空點,即 "start==end" 則不寫入容器
特殊情況?如果沒有空點,但是移動后 "start==end" ????
*//**************** 畫筆顏色 ****************/
// 打開調色板
void Widget::on_pushButton_clicked()
{line_attr_temp.color = QColorDialog::getColor(Qt::black,this,"選擇顏色");
}/**************** 畫筆粗細 ****************/
void Widget::on_pushButton_2_clicked()
{line_attr_temp.width=1;
}void Widget::on_pushButton_3_clicked()
{line_attr_temp.width=5;
}void Widget::on_pushButton_4_clicked()
{line_attr_temp.width=10;
}/**************** 橡皮擦邏輯 ****************/
void Widget::on_pushButton_5_clicked()
{//備份當前畫筆屬性static struct line_attr line_attr_temp_backup = line_attr_temp;//切換橡皮擦狀態rubber_in_use=!rubber_in_use;if(rubber_in_use){//更改橡皮擦文本ui->pushButton_5->setText("使用中");//設置橡皮擦畫筆line_attr_temp.color = this->palette().color(QPalette::Background);qDebug() << "北京顏色" << this->palette().color(QPalette::Background);line_attr_temp.width = 30;//其他操作ui->pushButton->setEnabled(0);      //使調色板失效ui->pushButton_2->setEnabled(0);    //使畫筆粗細失效ui->pushButton_3->setEnabled(0);ui->pushButton_4->setEnabled(0);}else{//按鈕文本描述ui->pushButton_5->setText("Erasers");//恢復畫筆屬性line_attr_temp=line_attr_temp_backup;//其他操作ui->pushButton->setEnabled(1);ui->pushButton_2->setEnabled(1);ui->pushButton_3->setEnabled(1);ui->pushButton_4->setEnabled(1);}
}/**************** Ctrl + Z ****************/
void Widget::keyPressEvent(QKeyEvent *event)
{if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z){qDebug() << "Ctrl + Z 按下";// 如果容器不為空if (!per_start_list.isEmpty()){// 則允許遍歷撤銷while(lines_attr.last().line.p1() != per_start_list.last()){qDebug() << "成功進入p1()";// 則刪除最后一個元素lines_attr.removeLast();}lines_attr.removeLast();per_start_list.removeLast();}update();   //手動更新,觸發繪圖}
}

效果

顏色的隨時調整

橡皮擦

撤銷上一步

撤銷完全

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

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

相關文章

Selenium 中 ActionChains 支持的鼠標和鍵盤操作設置及最佳實踐

Selenium 中 ActionChains 支持的鼠標和鍵盤操作設置及最佳實踐 一、引言 在使用 Selenium 進行自動化測試時&#xff0c;ActionChains 類提供了強大的功能&#xff0c;用于模擬鼠標和鍵盤的各種操作。通過 ActionChains&#xff0c;可以實現復雜的用戶交互&#xff0c;如鼠標…

前端面試技術性場景題

87.場景面試之大數運算&#xff1a;超過js中number最大值的數怎么處理 在 JavaScript 中&#xff0c;Number.MAX_SAFE_INTEGER&#xff08;即 2^53 - 1&#xff0c;即 9007199254740991&#xff09;是能被安全表示的最大整數。超過此值時&#xff0c;普通的 Number 類型會出現…

【js逆向】iwencai國內某金融網站實戰

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中隨便輸入關鍵詞 查看請求標頭&#xff0c;請求頭中有一個特殊的 Hexin-V,它是加密過的&#xff1b;響應數據包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;這個值和cooki…

ES Module 的 import 導入和 import () 動態導入

ES Module 的 import 導入和 import () 動態導入介紹 一、ES Module 簡介 ES Module 是 JavaScript 官方提供的標準化模塊系統&#xff0c;它的出現解決了長期以來 JavaScript 在模塊管理方面的混亂局面。通過 ES Module&#xff0c;開發者可以更加方便地組織和復用代碼&…

使用Node.js從零搭建DeepSeek本地部署(Express框架、Ollama)

目錄 1.安裝Node.js和npm2.初始化項目3.安裝Ollama4.下載DeepSeek模型5.創建Node.js服務器6.運行服務器7.Web UI對話-Chrome插件-Page Assist 1.安裝Node.js和npm 首先確保我們機器上已經安裝了Node.js和npm。如果未安裝&#xff0c;可以通過以下鏈接下載并安裝適合我們操作系…

BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN學習

目錄 一、網頁功能探索 二、SSTI注入 三、方法一 四、方法二 使用PIN碼 &#xff08;1&#xff09;服務器運行flask登錄所需的用戶名 &#xff08;2&#xff09;modename &#xff08;3&#xff09;flask庫下app.py的絕對路徑 &#xff08;4&#xff09;當前網絡的mac地…

Java基礎關鍵_018_集合(二)

目 錄 一、泛型 ※ 1.說明 2.實例 3.擦除與補償 4.泛型的定義 &#xff08;1&#xff09;類定義 &#xff08;2&#xff09;靜態方法定義 &#xff08;3&#xff09;接口定義 5.通配符 &#xff08;1&#xff09;無限定 &#xff08;2&#xff09;上限 &#xff…

FPGA學習篇——Verilog學習3(關鍵字+注釋方法+程序基本框架)

1 Verilog常用關鍵字 大概知道以下哪些是關鍵字就好&#xff0c;如何使用還是得在編寫代碼中來學習。 2 Verilog注釋方法 Verilog有兩種注釋方式&#xff1a; 2.1 “ // ” 單行。 2.2 “ /* ... */ ” 可擴展多行。 3 Verilog程序基本框架 Verilog 的基本設計單元是“…

FPGA之USB通信實戰:基于FX2芯片的Slave FIFO回環測試詳解

FPGA之Usb數據傳輸 Usb 通信 你也許會有疑問&#xff0c;明明有這么多通信方式和數據傳輸&#xff08;SPI、I2C、UART、以太網&#xff09;為什么偏偏使用USB呢? 原因有很多&#xff0c;如下&#xff1a; 1. 高速數據傳輸能力 高帶寬&#xff1a;USB接口提供了較高的數據傳…

深入理解與配置 Nginx TCP 日志輸出

一、背景介紹 在現代網絡架構中&#xff0c;Nginx 作為一款高性能的 Web 服務器和反向代理服務器&#xff0c;廣泛應用于各種場景。除了對 HTTP/HTTPS 協議的出色支持&#xff0c;Nginx 從 1.9.0 版本開始引入了對 TCP 和 UDP 協議的代理功能&#xff0c;這使得它在處理數據庫…

【大模型安全】安全解決方案

【大模型安全】安全解決方案 1.技術層面2.數據層面數據收集階段訓練階段模型推理階段 1.技術層面 在使用大語言模型時&#xff0c;通常有幾種選擇&#xff1a;一種是采用封裝好的大語言模型SaaS云服務&#xff1b;另一種是在公有云上部署自有的大語言模型&#xff0c;并通過權…

python中httpx庫的詳細使用及案例

文章目錄 1. 安裝 httpx2. 同步請求3. 異步請求4. 高級功能5. 錯誤處理6. 配置客戶端7. 結合 Beautiful Soup 使用8. 示例:抓取并解析網頁9. 注意事項httpx 是一個現代化的 Python HTTP 客戶端庫,支持同步和異步請求,功能強大且易于使用。它比 requests 更高效,支持 HTTP/2…

OpenCV計算攝影學(19)非真實感渲染(Non-Photorealistic Rendering, NPR)

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 非真實感渲染&#xff08;Non-Photorealistic Rendering, NPR&#xff09;是一種計算機圖形學技術&#xff0c;旨在生成具有藝術風格或其他非現實…

微信小程序點擊按鈕,將圖片下載到本地

前言&#xff1a; 最近在公司完成一個小程序的時候需要實現一個功能&#xff1a;點擊按鈕獲取用戶相冊權限&#xff0c;將圖片下載到用戶本地相冊&#xff0c;經過了好幾次的嘗試最終算是實現了。將總結的經驗在這里分享給小伙伴們。 實現方式&#xff1a; //.wxml文件 <…

數據倉庫為什么要分層

數據倉庫分層架構是數據倉庫設計中的一個重要概念&#xff0c;其主要目的是為了更好地組織和管理數據&#xff0c;提高數據倉庫的可維護性、可擴展性和性能。分層架構將數據倉庫劃分為多個層次&#xff0c;每個層次都有其特定的職責和功能。以下是數據倉庫分層的主要原因和好處…

selenium庫

一、什么是selenium庫&#xff1f; selenim是一個用于Web應用程序自動化測試工具&#xff0c;selenium測試直接運行在瀏覽器中 像真正的用戶在操作一樣&#xff0c;驅動瀏覽器執行特定的動作&#xff0c;如點擊&#xff0c;下拉等操作 二、selenium在爬蟲中的應用 獲取動態…

python從入門到精通(二十四):python爬蟲實現登錄功能

這里寫目錄標題 requests實現登錄功能selenium實現登錄功能 requests實現登錄功能 使用 requests 庫結合會話&#xff08;Session&#xff09;來嘗試登錄。不過豆瓣有反爬蟲機制&#xff0c;這種方式可能會受到驗證碼等因素的限制 import requests import re# 豆瓣登錄頁面 l…

十七、從0開始卷出一個新項目之瑞薩RZN2L定時器(GPT)+DMA生成PWM的運動控制

一、概述 嵌入式科普(34)通過對比看透DMA的本質 分享瑞薩RZN2L使用DMA生成PWM的運動控制的例程源碼 rzn2l必要的外設資源&#xff1a; rzn2l擁有32-bit timer General PWM Timer (GPT) with 18 channels CPU、GPT最高頻率400Mhz DMAC0 and DMAC1 8 channels 8 channels 還…

MR的環形緩沖區(底層)

MapReduce的大致流程&#xff1a; 1、HDFS讀取數據&#xff1b; 2、按照規則進行分片&#xff0c;形成若干個spilt&#xff1b; 3、進行Map 4、打上分區標簽&#xff08;patition&#xff09; 5、數據入環形緩沖區&#xff08;KVbuffer&#xff09; 6、原地排序&#xff…

解鎖STM32外設:開啟嵌入式開發新世界

???這里是小韓學長yyds的BLOG(喜歡作者的點個關注吧) ???想要了解更多內容可以訪問我的主頁 小韓學長yyds-CSDN博客 目錄 探索 STM32 強大的外設家族 初窺門徑&#xff1a;STM32 外設開發基礎 開發方式與工具 外設配置基礎步驟 深入剖析&#xff1a;常見外設應用實例…