天天看点

【精华】在Qt中实现放大镜功能

要在Qt中实现放大镜功能,您可以创建一个自定义的放大镜控件,并利用鼠标事件和绘图来实现放大镜效果。

以下是一个简单的示例代码,演示如何在Qt中实现放大镜功能:

#include <QApplication>
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QWidget>

class MagnifierWidget : public QWidget {
    Q_OBJECT

public:
    explicit MagnifierWidget(QWidget* parent = nullptr)
        : QWidget(parent),
          zoomFactor(2.0),
          radius(100),
          pixmap(nullptr) {
        setFixedSize(radius * 2, radius * 2);
        setMouseTracking(true);
    }

    void setZoomFactor(double factor) {
        zoomFactor = factor;
        update();
    }

    void setRadius(int r) {
        radius = r;
        setFixedSize(radius * 2, radius * 2);
        update();
    }

protected:
    void mouseMoveEvent(QMouseEvent* event) override {
        if (pixmap) {
            int x = event->pos().x() - radius;
            int y = event->pos().y() - radius;

            QPoint sourcePoint(x / zoomFactor, y / zoomFactor);
            QRect sourceRect(sourcePoint.x(), sourcePoint.y(), width() / zoomFactor, height() / zoomFactor);
            QPixmap zoomedPixmap = pixmap->copy(sourceRect);

            QPainter painter(this);
            painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
            painter.drawPixmap(rect(), zoomedPixmap);
        }
    }

    void paintEvent(QPaintEvent* event) override {
        Q_UNUSED(event);

        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);

        if (pixmap) {
            painter.drawPixmap(rect(), *pixmap);
        } else {
            painter.fillRect(rect(), Qt::white);
        }

        // 绘制放大镜边框
        painter.setPen(Qt::black);
        painter.setBrush(Qt::NoBrush);
        painter.drawEllipse(rect().adjusted(0, 0, -1, -1));
    }

public slots:
    void setPixmap(const QPixmap& pixmap) {
        this->pixmap = new QPixmap(pixmap);
        update();
    }

private:
    double zoomFactor;    // 缩放因子
    int radius;           // 放大镜半径
    QPixmap* pixmap;      // 原始图片的指针
};

           

使用示例:

#include <QApplication>
#include <QLabel>
#include <QPixmap>
#include <QVBoxLayout>
#include "magnifierwidget.h"

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);

    QLabel* imageLabel = new QLabel;
    QPixmap pixmap(":/path/to/your/image.jpg");
    imageLabel->setPixmap(pixmap);

    MagnifierWidget* magnifier = new MagnifierWidget;
    magnifier->setPixmap(pixmap);
    magnifier->setZoomFactor(2.5); // 设置放大因子,默认为2.0
    magnifier->setRadius(100);     // 设置放大镜半径,默认为100

    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(imageLabel);
    layout->addWidget(magnifier);

    QWidget window;
    window.setLayout(layout);
    window.show();

    return a.exec();
}
           

在上述代码中,您需要将 :/path/to/your/image.jpg 替换为您自己的图像路径。然后,您可以通过调整放大镜的缩放因子和半径来适应您的需求。最后,将 MagnifierWidget 置于图像上方,即可实现放大镜的功能。

注意:为了使用上述代码,您需要创建一个名为 "magnifierwidget.h" 的头文件,并在其中添加 #include <QWidget> 和 #include <QPixmap>。