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控件的新尺寸
}