Qt联合Halcon,实现在子窗口绑定Halcon窗口,且实现在主窗 口内显示,能自适应主窗口的大小,随着主窗口的变化而变化

1,halcon配置Qt在博客里面。自行查找。

      主窗体头文件

#include <QMainWindow>
#include<form.h>//子窗体的头文件
#include<QResizeEvent>//必须添加
#include<QDebug>

//halcon表头
#include "HalconCpp.h"
#include "HDevThread.h"
using namespace  HalconCpp;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE


class MainWindow : public QMainWindow
{
    Q_OBJECT


public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public:
 void resizeEvent(QResizeEvent *event);//重新resizeEvent
private slots:
   
private:
    Ui::MainWindow *ui;
    Form*n=nullptr;
};
#endif // MAINWINDOW_H

2,主窗体源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::resizeEvent(QResizeEvent *event)
{

    if (!n || (n && n->parent() != ui->label)) // 检查n是否为null或其父控件不是label时
    {
        if (n) {
            delete n; // 先释放之前的n对象
            n = nullptr; // 立即将n设置为nullptr以避免悬挂指针
        }
        // 检查ui和ui->label是否有效
        if (ui && ui->label) {
            try {
                n = new Form(ui->label);
                n->setParent(ui->label); // 设置子窗体的父控件为label
            } catch(...) {
                // 处理或记录异常
            }
        }
    }

    // 检查ui和ui->label是否有效
    if (ui && ui->label) {
        this->ui->label->setScaledContents(true); // 设置 QLabel 控件的内容自适应大小
        this->ui->label->setAlignment(Qt::AlignCenter); // 设置 QLabel 控件内容居中

        if (n)
        {
            // 检查n是否为null,避免访问非法指针
            QSize Fsize = this->ui->label->size();
            n->setFixedSize(Fsize); // 根据label 控件的大小设置子窗体的大小
            //n->checkSize();

        }
    }
}

3,子窗体头文件

#ifndef FORM_H
#define FORM_H

#include <QWidget>

#include <windows.h>        //注意头文件
#include <windowsx.h>
#include <QMouseEvent>
#include<QResizeEvent>
#include<QLabel>
//halcon表头
#include "HalconCpp.h"
#include "HDevThread.h"
using namespace  HalconCpp;

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();
public:
   void resizeEvent(QResizeEvent *event) ;//重写resizeEvent事件
  void CreateHW();
};

#endif // FORM_H

4,子窗体源文件

#include "form.h"
#include "ui_form.h"
#include "QDebug"



Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    // 去掉标题栏,去掉工具栏
      setWindowFlags(Qt::FramelessWindowHint);
      ui->setupUi(this);
      CreateHW();

}


Form::~Form()
{
    delete ui;
}

HObject ho_Image;

//绑定halcon窗口
void Form::CreateHW()
{
        Hlong windID = (Hlong)this->ui->label->winId();//绑定控件与halcon窗口
        OpenWindow(0,0,621,471,windID,"visible","",&m_HalconWindow);//创建一个窗体ui


        HDevWindowStack::Push(m_HalconWindow);
        //SetPart(m_HalconWindow,0,0,hv_Height,hv_Widt);
        SetSystem("flush_graphic", "true");
        //SetColor("read",m_HalconWindow);

        HObject emptyObject;
        emptyObject.GenEmptyObj();
        DispObj(emptyObject, m_HalconWindow);
}
//重写resizeEvent
void Form::resizeEvent(QResizeEvent *event)
{

       QSize size = this->ui->label->size();
      // qDebug()<<"G"<<size.height();
       //qDebug()<<"K"<<size.width();
       SetPart(m_HalconWindow,0,0,size.height(), size.width());
       if(HDevWindowStack::IsOpen())
           CloseWindow(m_HalconWindow);
        Hlong windIDl = (Hlong)this->ui->label->winId();//绑定控件与halcon窗口
        OpenWindow(0,0, size.width(),size.height(),windIDl,"visible","",&m_HalconWindow);
       //Form::resizeEvent(event);

// 获取QLabel控件的新尺寸

}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将HalconQt集成,可以使用Halcon提供的HDevelopQt库。该库提供了一组类和函数,可用于将Halcon窗口嵌入到Qt应用程序中。 以下是一个简单的示例,演示如何将Halcon窗口绑定Qt窗口: 1. 创建一个Qt窗口,并在该窗口中添加一个QWidget控件,用于容纳Halcon窗口。 2. 使用HDevelopQt库中的代码创建一个Halcon窗口,并将其绑定到QWidget控件中。 3. 在Qt窗口中添加一些控件,例如按钮或滑动条,以便可以与Halcon窗口交互。 下面是一个示例代码,演示如何将Halcon窗口绑定Qt窗口: ```c++ #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtWidgets/QVBoxLayout> #include <QtCore/QDebug> #include <HalconCpp/HalconCpp.h> #include <HDevThread/HDevThread.h> #include <HDevelopQt/HTupleQt.h> #include <HDevelopQt/HDevEngineThread.h> #include <HDevelopQt/HalconWidget.h> int main(int argc, char **argv) { QApplication app(argc, argv); QMainWindow window; QWidget *centralWidget = new QWidget(&window); QVBoxLayout *layout = new QVBoxLayout(centralWidget); HalconCpp::HObject image; // Load an image from file HalconCpp::ReadImage(&image, "image.bmp"); // Create a Halcon widget HalconCpp::HTuple windowHandle; HalconCpp::HalconWidget halconWidget(centralWidget); // Bind the Halcon widget to the Qt widget bool success = halconWidget.Bind(&windowHandle); if(!success) { qDebug() << "Failed to bind Halcon widget!"; return -1; } // Display the image in the Halcon widget HalconCpp::SetWindowAttr("background_color", "black"); HalconCpp::HDevWindowStack::Push(halconWidget.GetHalconWindow()); HalconCpp::DispObj(image, halconWidget.GetHalconWindow()); HalconCpp::HDevWindowStack::SetActive(halconWidget.GetHalconWindow()); // Add some controls to the Qt window layout->addWidget(&halconWidget); window.setCentralWidget(centralWidget); window.show(); return app.exec(); } ``` 在这个示例中,我们首先创建了一个Qt窗口,并在其中添加了一个QWidget控件,然后创建了一个Halcon图像对象,并使用HalconWidget类创建了一个Halcon窗口。然后,我们将这个Halcon窗口与QWidget控件绑定,并在Halcon窗口显示图像。最后,我们将Halcon窗口添加到Qt窗口中,并显示整个应用程序。 请注意,以上示例假定您已经熟悉了QtHalcon的基本概念。如果您对这些技术还不熟悉,请先学习它们的基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值