要实现这个功能,需要使用QT的QWidget和Halcon的HWindow窗口控件。以下是代码示例:

#include <QWidget>
#include <HalconCpp.h>

class HWindowWidget : public QWidget
{
public:
    HWindowWidget(QWidget *parent = nullptr) : QWidget(parent), halcon_window_(nullptr)
    {
        // 设置窗口属性
        setAutoFillBackground(false);
        setAttribute(Qt::WA_PaintOnScreen);
        setAttribute(Qt::WA_NoSystemBackground);

        // 创建Halcon窗口
        halcon_window_ = new HalconCpp::HWindow();
        halcon_window_->SetPart(0, 0, -1, -1);
        halcon_window_->SetWindowParam("graphics_stack", "true");

        // 将Halcon窗口嵌入QT窗口
        HalconCpp::Hlong id = (HalconCpp::Hlong)winId();
        halcon_window_->OpenWindow(id, "", "", "", "", "visible", "");
    }

    ~HWindowWidget()
    {
        delete halcon_window_;
    }

    // 重写QWidget的绘图函数,将Halcon窗口的图像绘制到QT窗口上
    void paintEvent(QPaintEvent*) override
    {
        QPainter painter(this);
        HalconCpp::HImage image = halcon_window_->DumpWindowImage();
        QImage qt_image((uchar*)image.GetImagePointer1(), image.Width(), image.Height(), QImage::Format_RGB888);
        painter.drawImage(0, 0, qt_image);
    }

    // 重写QWidget的尺寸调整函数,调整Halcon窗口的大小
    void resizeEvent(QResizeEvent* event) override
    {
        halcon_window_->SetPart(0, 0, event->size().width(), event->size().height());
    }

    // 重写QWidget的鼠标事件函数,实现图片的拖曳和缩放
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->button() == Qt::LeftButton)
        {
            drag_start_ = event->pos();
            drag_start_center_ = halcon_window_->GetPartRow() + halcon_window_->GetPartHeight() / 2.0,
                halcon_window_->GetPartCol() + halcon_window_->GetPartWidth() / 2.0;
        }
        else if (event->button() == Qt::RightButton)
        {
            zoom_start_ = event->pos();
            zoom_start_size_ = halcon_window_->GetPartHeight();
        }
    }

    void mouseMoveEvent(QMouseEvent *event) override
    {
        if (event->buttons() & Qt::LeftButton)
        {
            QPoint diff = event->pos() - drag_start_;
            halcon_window_->SetPart(halcon_window_->GetPartRow() - diff.y(), halcon_window_->GetPartCol() - diff.x(),
                -1, -1);
            update();
        }
        else if (event->buttons() & Qt::RightButton)
        {
            int diff = event->pos().y() - zoom_start_.y();
            double scale = std::pow(2.0, diff / 100.0);
            int height = std::round(zoom_start_size_ * scale);
            halcon_window_->SetPart(halcon_window_->GetPartRow(), halcon_window_->GetPartCol(),
                height, height * halcon_window_->GetPartWidth() / halcon_window_->GetPartHeight());
            update();
        }
    }

private:
    HalconCpp::HWindow* halcon_window_;
    QPoint drag_start_;
    double drag_start_center_;
    QPoint zoom_start_;
    int zoom_start_size_;
};

使用时,只需要将HWindowWidget添加到QT的布局中即可:

HWindowWidget* window_widget = new HWindowWidget();
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(window_widget);
setLayout(layout);
``
使用QT和halcon联合开发一个显示窗口支持图片的缩放和拖曳

原文地址: https://www.cveoy.top/t/topic/cKb6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录