由於專案要求,需要在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...