国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt中QGraphicsView架構下實時鼠標繪制圖形

這篇具有很好參考價值的文章主要介紹了Qt中QGraphicsView架構下實時鼠標繪制圖形。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

Qt中QGraphicsView架構下實時鼠標繪制圖形,Qt,計算機外設,qt

功能實現(xiàn)

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

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

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

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

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

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

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

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

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

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

Qt中QGraphicsView架構下實時鼠標繪制圖形,Qt,計算機外設,qt

今天只講述 矩形: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語句之前的內容都是在設置圖形的風格,比如:setRenderHint防止圖形走樣;最需要我們注意的是下面一句代碼:

m_pTempCanvasImg->fill(Qt::transparent);

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

Qt中QGraphicsView架構下實時鼠標繪制圖形,Qt,計算機外設,qt

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框架,基本原理都是一致的,基本上不會離開鼠標的三大事件。

我是糯諾諾米團,一名C++開發(fā)程序媛~文章來源地址http://www.zghlxwxcb.cn/news/detail-813849.html

到了這里,關于Qt中QGraphicsView架構下實時鼠標繪制圖形的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Qt鼠標拖動繪制基本幾何圖形

    Qt鼠標拖動繪制基本幾何圖形

    用Qt鼠標事件實現(xiàn)基本幾何圖形的繪制,支持直線、矩形、圓形、橢圓。后期可以在此基礎上進行擴展。 效果圖 實現(xiàn) 本示例使用QGraphics體系來實現(xiàn),因為要移動對象,所以生成的圖形必須是一個單獨的對象,鼠標拖動繪制的過程是在臨時層中完成,release后生成一個矢量的圖

    2024年02月13日
    瀏覽(26)
  • Qt:界面實時響應鼠標拖動繪制

    Qt:界面實時響應鼠標拖動繪制

    采用雙緩沖實現(xiàn)界面實時響應鼠標的拖動繪制。 思想如下:首先需要兩張畫布pix和tempPix,他們都是QPixmap實例;pix用來保存初始界面或上一階段以完成的繪制;tempPix用來作為鼠標拖動時的實時界面繪制;當鼠標左鍵按下后拖動時每次都將將pix賦值給tempPix,然后用tempPix進行繪

    2024年02月11日
    瀏覽(22)
  • QGraphicsView通過鼠標操作來繪制圖元

    QGraphicsView通過鼠標操作來繪制圖元

    在Visio和MindManager等類似的圖元操作軟件中,很多時候我們會通過鼠標操作來添加自定義的圖元。這里就介紹一下如何在QT的圖形視圖框架中通過鼠標繪制來添加圖元。 在實現(xiàn)的時候我們先添加一個自定義圖元用來響應鼠標操作,自定義圖元的實現(xiàn)如下所示. 輔助圖元類似于標

    2024年02月13日
    瀏覽(73)
  • QGraphicsView制作繪制圖元工具資料整理(鼠標、平移、縮放)

    QGraphicsView制作繪制圖元工具資料整理(鼠標、平移、縮放)

    QGraphicsView制作繪制工具資料整理 繼承自QGraphicsView的類中使用QGraphicsSceneMouseEvent 簡單顯示圖片的示例 Qt之QGraphicsView入門篇 Qt之QGraphicsView入門篇 鼠標事件和滾輪事件 鼠標事件和滾輪事件 QGraphicsItem的縮放 QGraphicsItem的縮放 QT官方文檔:QGraphicsItem Class QGraphicsItem Class Qt之QGraph

    2024年02月09日
    瀏覽(31)
  • QT QGraphicsView 在鼠標點擊處進行放大縮小

    QT QGraphicsView 在鼠標點擊處進行放大縮小

    一、前段時間在用QGraphicsView對圖元進行放大縮小時,發(fā)現(xiàn)圖形總是越來越跑偏,無法像地圖中那樣,點擊哪里就能放大哪個地方。 如下所示:此時放大縮小的焦點并不在鼠標位置 方法,使用QGraphicsView類的設置屬性函數(shù).在構造函數(shù)中增加下面兩個函數(shù)即可。 此時以鼠標為中

    2024年02月16日
    瀏覽(22)
  • 【[Qt]基于QGraphicsView的圖像顯示控件,支持放大、縮小、鼠標拖動】

    【[Qt]基于QGraphicsView的圖像顯示控件,支持放大、縮小、鼠標拖動】

    ImageViewer.h文件 ImageViewer.cpp 文件 具體使用代碼如下 1、初始化類對象,并加入界面布局中 2、打開圖像,并加載到控件中 3、從控件中卸載圖片 源碼鏈接:https://download.csdn.net/download/xiaohuihuihuige/87239431 百度云: 鏈接:https://pan.baidu.com/s/1W-KUlIKUFAktUKFin63N0g 提取碼:4g8a

    2024年02月11日
    瀏覽(102)
  • Qt中QGraphicsView總體架構學習

    Qt中QGraphicsView總體架構學習

    前段時間學習了下如何在QGraphicsView架構中繪制刻度尺,主要是與OnPainter中進行比較的,那么今天就來詳細講解下我對QGraphicsView框架的認知吧~ 最近一段時間想學習下,如果我有不正確的,歡迎留言探討喲~ 使用過OnPainter繪制過圖形的,QPainter繪制需要在繪制設備的paintEvent()事

    2024年02月02日
    瀏覽(26)
  • 計算機圖形學:繪制一個3d交互場景(1)

    計算機圖形學:繪制一個3d交互場景(1)

    OpenGL作為一種圖形與硬件的接口,與其他圖形程序開發(fā)工具相比較,它提供了眾多圖形函數(shù),直觀的編程環(huán)境簡化了三維圖形的繪制過程,使用OpenGL搭建一個三維場景,能夠通過輸入設備與場景內物體交互。 豪華單間 配置環(huán)境:vs22+freeglut庫 1.繪制墻體使其成為封閉空間,在

    2024年02月11日
    瀏覽(79)
  • 【計算機圖形學】作業(yè):Bresenham 法繪制圓

    請采用 Bresenham 法繪制圓(共 30 分)。要求: (1) 給出算法的文字描述(共 15 分)。 (2) 編寫函數(shù),在給定圓心坐標和半徑的情況下,計算出圓 上所有的點,并將這些點存儲在數(shù)組中(共 15 分)。 輸入圓的圓心(xc,yc),半徑r。數(shù)組circlepoints為輸出,保存圓上所有點。 初

    2024年01月24日
    瀏覽(29)
  • 【計算機圖形學】【實驗報告】太陽系繪制、B樣條曲線繪制(附代碼)

    【計算機圖形學】【實驗報告】太陽系繪制、B樣條曲線繪制(附代碼)

    實 驗 報 告 一、實驗目的 掌握三維圖形的顯示原理和方法,掌握三維觀察的原理和方法; 掌握OpenGL中矩陣堆棧函數(shù)的使用,會使用堆棧函數(shù)進行復雜場景的組裝。 掌握OpenGL中三維觀察變換常用的函數(shù)的使用方法,了解三維模型的貼圖方法; 掌握自由曲線的生成方法,熟練

    2024年02月10日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包