使用QT和halcon联合开发一个显示窗口支持图片的缩放和拖曳
要实现这个功能,需要使用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);
``
原文地址: https://www.cveoy.top/t/topic/cKb6 著作权归作者所有。请勿转载和采集!