Qt QWidget實現手勢縮放和平移(一)

2021-07-26 01:52:09 字數 2811 閱讀 7026

由於專案要求,需要在qwidget中實現乙個手勢操作的功能,對進行放大/縮小/平移功能,並且還需要支援通過滑鼠和鍵盤來實現該功能。其實這種功能在qgraphicsview中實現比較簡單, 不過在qwidget中也能實現,本次通過qgestureevent來捕捉手勢操作,然後對進行縮放或者移動。

廢話不多說,直接上**

首先來看標頭檔案:

class qgestureevent;

class qpangesture;

class qpinchgesture;

class qswipegesture;

class cprojectionpicture;

class cprojectionpicture : public qwidget

;

原始檔:

cprojectionpicture::cprojectionpicture(qwidget *parent)

: qwidget(parent),

horizontaloffset(0),

verticaloffset(0),

scalefactor(1),

currentstepscalefactor(1),

m_translatebutton(qt::leftbutton),

m_bmousetranslate(false),

m_zoomdelta(0.2),

void cprojectionpicture::setpicture(qimage &image)

bool cprojectionpicture::event(qevent *event)

void cprojectionpicture::paintevent(qpaintevent*)

const qreal iw = image.width();

const qreal ih = image.height();

const qreal wh = height();

const qreal ww = width();

painter.translate(ww/2, wh/2);

painter.translate(horizontaloffset, verticaloffset);

* scalefactor, currentstepscalefactor * scalefactor);

painter.translate(-iw/2, -ih/2);

painter.drawimage(0,0,image);

}void cprojectionpicture::mousedoubleclickevent(qmouseevent *)

bool cprojectionpicture::gestureevent(qgestureevent *event)

void cprojectionpicture::pantriggered(qpangesture *gesture)

#endif

qpointf delta = gesture->delta();

horizontaloffset += delta.x();

verticaloffset += delta.y();

update();

}void cprojectionpicture::pinchtriggered(qpinchgesture *gesture)

if (gesture->state() == qt::gesturefinished)

update();

}void cprojectionpicture::resizeevent(qresizeevent*e)

// 上/下/左/右鍵向各個方向移動、加/減鍵進行縮放

void cprojectionpicture::keypressevent(qkeyevent *event)

qwidget::keypressevent(event);

}// 平移

void cprojectionpicture::mousemoveevent(qmouseevent *event)

m_lastmousepos = event->pos();

qwidget::mousemoveevent(event);

}void cprojectionpicture::mousepressevent(qmouseevent *event)

qwidget::mousepressevent(event);

}void cprojectionpicture::mousereleaseevent(qmouseevent *event)

qwidget::mousereleaseevent(event);

}// 放大/縮小

void cprojectionpicture::wheelevent(qwheelevent *event)

else if(scrallamount.y() < 0)

qwidget::wheelevent(event);

}// 放大

void cprojectionpicture::zoomin()

// 縮小

void cprojectionpicture::zoomout()

// 縮放 - scalefactor:縮放的比例因子

void cprojectionpicture::zoom(float scale)

// 平移

void cprojectionpicture::translate(qpointf delta)

本文參考:

Android通過手勢實現的縮放處理

android自定義手勢縮放控制項 eoeandroid社群索引 圖形影象之影象處理 縮放 旋轉 轉化 帖子正文 今天在看到這個不錯的技術點,拿出來分享一下,希望大家能夠一起學習成長 import import android.content.context import android.graph...

Android通過手勢實現的縮放處理

主要原理是ontouchevent事件中的引數motionevent,它有乙個getsize 方法。在乙個點的時候,該方法永遠返回0,而在兩個觸電的時候,該方法則根據兩點相對位置變化而返回不同的值。我們只需計算出兩點之間的距離變化,距離的大小表明我們希望目標變化的趨勢。而getx 和gety 方法則...

Android通過手勢實現的縮放處理

android自定義手勢縮放控制項 eoeandroid社群索引 圖形影象之影象處理 縮放 旋轉 轉化 帖子正文 今天在看到這個不錯的技術點,拿出來分享一下,希望大家能夠一起學習成長 import import android.content.context import android.graph...