亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt實現(xiàn)實時鼠標繪制圖形

 更新時間:2022年02月07日 17:23:49   作者:中國好公民st  
這篇文章主要介紹了Qt中QGraphicsView架構下如何實現(xiàn)實時鼠標繪制圖形,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手試一試

上一章節(jié)介紹了關于QGraphicsView的基礎講解,以及簡單的類圖創(chuàng)建,由上一章節(jié)中最后展示的動畫效果來看,今年主要講述如何在QGraphicsView架構下,實時拖動鼠標繪制圖形!

今天主要以矩形為例,再來看一下展示效果吧!

功能實現(xiàn)

想要實現(xiàn)鼠標拖拽繪圖的效果,離不開鼠標的三大事件:按下、移動、釋放

那么具體實現(xiàn)實時繪制矩形框的核心流程是什么呢?

第一步:鼠標左鍵點擊,記錄初始點擊位置

第二步:在窗口中移動鼠標,實時獲取鼠標拖動點,根據(jù)拖動點繪制指定形狀

第三步:鼠標點擊右鍵釋放鼠標,繪制最終圖形

描述的實現(xiàn)流程很簡單,那么,接下來就實際操作吧!

在進行鼠標點擊繪制的時候,為了兼容多個圖形的實時繪制,這里,不只是用兩個QPoint成員變量記錄鼠標點,而是采取了vector<QPontF>容器存儲的方式。

例如:三角形圖形,需要三個點才能確定圖形;曲線圖形,是由N多個點才能確定圖形;等等。。。

所以說,這里采用了vector容器進行數(shù)據(jù)存儲,任何圖形的點都可以進行存儲。

所有的圖形枚舉類型,如下表格:

枚舉類型形狀
Drawing_Normal無圖形繪制
Drawing_Circular圓形
Drawing_StraightLine直線
Drawing_Rectangular矩形
Drawing_Triangle三角形
Drawing_ManyLineSegements多線段
Drawing_Curve曲線

今天只講述 矩形:Drawing_Rectangular

1:記錄圖形第一個繪制點

只有鼠標點擊后才能獲取當前點擊點的位置,所以,記錄按下點操作應該是在鼠標的mousePressEvent中實現(xiàn)的。

void QCustomQGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠標左鍵,點擊繪制圖形;鼠標右鍵,點擊拖動圖形
	QGraphicsScene::mousePressEvent(e);

	if (e->button() & Qt::LeftButton)
	{
                //當圖形處于繪制狀態(tài)時
		if (m_enumShape!= Drawing_Normal)
		{
			//記錄鼠標按下的點
                        m_vetPoints.push_back(e->scenePos());
		}
	}
}

代碼解析:當進入到鼠標按下消息后,只有在左鍵按下狀態(tài)時,才做繪圖操作,并且當前形狀枚舉類型有效。

2:實時獲取鼠標最新位置并繪圖

鼠標想要實時繪制,那一定是在鼠標的mouseMoveEvent事件中操作的。

void QCustomQGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠標移動時,如果存在有效圖形類型,進行圖形繪制
	QGraphicsScene::mouseMoveEvent(e);
	if (m_enumShape!= Drawing_Normal)
	{
                m_pTempLayer->DrawShape(m_enumShape, m_vetPt, e->scenePos());
	}

}

代碼解析:當鼠標進入到mouseMoveEvent事件后,并且,當前枚舉類型處于有效狀態(tài)時,需要實時繪制圖形。

函數(shù)DrawShape的講解:

參數(shù)1:圖形的枚舉類型,根據(jù)不同枚舉,繪制不同的圖形

參數(shù)2:vector<QPointF>傳入已經(jīng)記錄的鼠標點,可以是多個,但最少是1個。就例如當前繪制矩形來說,該容器中只是存儲了一個繪制點。

參數(shù)3:鼠標在mouseMoveEvent中實時拖動點

DrawShape函數(shù)實現(xiàn)代碼,如下:

void QTempCanvasLayer::DrawShape(ENUM_DrawingGraphic enumShape, std::vector<QPointF> vetPt, QPointF ptCurrent)
{
	m_pTempCanvasImg->fill(Qt::transparent);
	m_pTempPainter->setRenderHint(QPainter::Antialiasing, true);
	m_pTempPainter->setCompositionMode(QPainter::CompositionMode_Source);
	m_pTempPainter->setPen(QPen(QColor(51, 51, 51), 1, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin));
	switch (enumShape)
	{
	case Drawing_Circular: //圓形
		break;
	case Drawing_StraightLine: //直線
		break;
	case Drawing_Rectangular: //矩形
		m_pTempPainter->drawRect(QRectF(vetPt[0], ptCurrent));
		break;
	case Drawing_Triangle: //三角形
		break;
	case Drawing_ManyLineSegements: //多線段
		break;
	case Drawing_Curve: //曲線
		break;
	default:
		break;
	}
	update();
}

代碼講解:switch語句之前的內(nèi)容都是在設置圖形的風格,比如:setRenderHint防止圖形走樣;最需要我們注意的是下面一句代碼:

m_pTempCanvasImg->fill(Qt::transparent);

如果你忘記設置了,當鼠標在拖動繪制圖形時,會導致拖拽線條重疊的效果,就如下面展示效果一樣,如圖所示:

3:釋放繪制點,繪制最終圖形

鼠標事件:mouseReleaseEvent

void QCustomQGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * e)
{
	//TODO:鼠標釋放之后操作
	QGraphicsScene::mouseReleaseEvent(e);

	if (m_enumShape == Drawing_Normal)
	{
		return;
	}
	//存在有效的圖形類型,進行最終圖形繪制
	if (e->button() & Qt::RightButton)
	{
		if (m_enumShape == Drawing_Rectangular)
		{
			//繪制直線,需要存儲兩個有效點
			if (m_vetPt.size() == 2)
			{
				this->DrawRealShape(m_vetPt);
                                //如果當前正在繪制圖形,直接清除
				this->ClearCurrentDrawingShape(); 
			}
		}
	}
}

代碼解析:觸發(fā)了鼠標釋放事件后,并且是鼠標右鍵點擊(在這里都是以鼠標右鍵點擊作為最終的圖形繪制完成),此時,根據(jù)不同的枚舉類型進行圖形繪制。

對于矩形圖形來說,只需要兩個有效的點就會完整對圖形的繪制,其中this->DrawRealShape中進行最終點的繪制。

一個圖形數(shù)據(jù)繪制成功之后,需要將上一次存儲的臨時點進行清除,以備后續(xù)圖形繪制使用,說白了,也就是vector<QPointF>容器需要清除

實現(xiàn)完成了鼠標的三大事件,一個完整的實時鼠標圖形繪制思路已經(jīng)完成了。

總結

實現(xiàn)鼠標實時繪圖的功能,無論是MFC框架還是Qt框架,基本原理都是一致的,基本上不會離開鼠標的三大事件。

到此這篇關于Qt實現(xiàn)實時鼠標繪制圖形的文章就介紹到這了,更多相關Qt鼠標繪制圖形內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解C語言之文件操作下)

    詳解C語言之文件操作下)

    這篇文章主要介紹了關于C語言文件操作方法的相關資料,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • C++關鍵字typename的深入理解

    C++關鍵字typename的深入理解

    本篇文章是對C++中的關鍵字typename進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中時間戳轉換成時間字符串的方法

    C語言中時間戳轉換成時間字符串的方法

    在PE格式里有個字段是文件的創(chuàng)建時間戳,我想把轉成字符串,今天小編給大家分享一段代碼,可以比較直觀的看出,需要的的朋友參考下
    2017-02-02
  • C++設計模式中的工廠模式詳細介紹

    C++設計模式中的工廠模式詳細介紹

    工廠模式,是一種實例化對象的方式,只要輸入需要實例化對象的名字,就可以通過工廠對象的相應工廠函數(shù)來制造你需要的對象
    2022-09-09
  • c++ 類和對象總結

    c++ 類和對象總結

    這篇文章主要介紹了c++ 類和對象總結一,需要的朋友可以參考下
    2020-01-01
  • C語言 枚舉類型(Enum)詳解及示例代碼

    C語言 枚舉類型(Enum)詳解及示例代碼

    本文主要介紹C語言 枚舉類型,這里提供了詳細的相關資料及示例代碼,以便大家學習參考,有興趣的小伙伴可以參考下
    2016-08-08
  • C/C++獲取當前時間的方法總結(最全)

    C/C++獲取當前時間的方法總結(最全)

    這篇文章主要為大家整理了C/C++中獲取當前時間的最全方法,文中的示例代碼講解詳細,具有一定的學習和借鑒價值,需要的可以了解一下
    2023-03-03
  • C語言實現(xiàn)簡單職工信息管理系統(tǒng)

    C語言實現(xiàn)簡單職工信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • VS Code遠程連接Linux服務器調試C程序的操作方法

    VS Code遠程連接Linux服務器調試C程序的操作方法

    這篇文章主要介紹了VS Code遠程連接Linux服務器調試C程序的操作方法,打開遠程 Linux 服務器上的文件夾本文以 /root/ 為例,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • Qt自定義表頭實現(xiàn)過濾功能的方法

    Qt自定義表頭實現(xiàn)過濾功能的方法

    這篇文章主要個給大家介紹了關于Qt自定義表頭實現(xiàn)過濾功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Qt具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07

最新評論