在看圖軟體裡,縮放並滾動查看圖片是很常見的需求。
今天我們就來實現這個重要的功能:縮放圖片 (Zoom in/Zoom out)。
要實現滾輪縮放,首先要知道 Qt 是怎麼監聽滑鼠滾輪事件的。其實 QWidget 原本就可以接收某些固定的事件,滾輪實現就是其中之一。物件名字叫做 QWeelEvent。
這就是滾輪事件的基本用法,只要 QWidget 複寫 wheelEvent(QWheelEvent* event)
方法,就可以收到滾輪事件:
void MyWidget::wheelEvent(QWheelEvent* event)
{
QPoint numPixels = event->pixelDelta();
QPoint numDegrees = event->angleDelta() / 8;
if (!numPixels.isNull()) {
qDebug() << numPixels;
}
event->accept();
}
請打開昨天的專案。
首先我們先設定 m_imageLabel,讓內部的圖片會隨著圖片標籤尺寸變動而跟著縮放:
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
{
m_imageLabel = new QLabel(this);
m_imageLabel->setBackgroundRole(QPalette::Base);
m_imageLabel->setScaledContents(true); // 這裡!
...
接著覆寫 wheelEvent() 方法:
void MainWindow::wheelEvent(QWheelEvent* event)
{
QPoint numPixels = event->pixelDelta();
if (!numPixels.isNull()) {
qDebug() << "Pixels:" << numPixels;
m_imageLabel->size();
QSize oldSize = m_imageLabel->size(); //->pixmap().size();
if (numPixels.y() > 0)
{
m_imageLabel->resize(oldSize * 1.1);
}
else if (numPixels.y() < 0)
{
m_imageLabel->resize(oldSize * 0.95);
}
}
event->accept();
}
滾輪的Y軸數值是正值的時候,就把圖片尺寸放大,負值時就減小,這樣就完成圖片縮放功能囉!