最近在捣鼓一个项目,过程中遇到了个问题。
为了展示DICOM图像的三视图,将ui界面中将一个openGLWidget控件提升为了QVTKOpenGLNativeWidget控件,然后为了获取该控件中的鼠标位置,自定义了一个类,重写了mouseMoveEvent()鼠标移动事件。
最后在进行信号槽连接时,问题出现了。
这个问题的产生是由于 ui.openGLWidget
在 .ui
文件中是声明为 QVTKOpenGLNativeWidget
类型,而不是 CustomVTKWidget(我自定义的一个类)
类型。不能直接把 QVTKOpenGLNativeWidget
当作 CustomVTKWidget
使用,因为它们是不同的类。
解决方法:
创建自定义类对象,该对象复制原控件的位置及大小,然后删除原控件。代码如下:
首先是自定义类:
CustomVTKWidget.h
#ifndef CUSTOMVTKWIDGET_H
#define CUSTOMVTKWIDGET_H
#include <QVTKOpenGLNativeWidget.h>
#include <QMouseEvent>
#include <QObject>
class CustomVTKWidget : public QVTKOpenGLNativeWidget {
Q_OBJECT
public:
explicit CustomVTKWidget(QWidget* parent = nullptr);
protected:
// 重写鼠标移动事件
void mouseMoveEvent(QMouseEvent* event) override;
signals:
// 自定义信号,用于传递鼠标坐标
void mousePositionChanged(int x, int y);
};
#endif // CUSTOMVTKWIDGET_H
CustomVTKWidget.cpp
#include "CustomVTKWidget.h"
CustomVTKWidget::CustomVTKWidget(QWidget* parent)
: QVTKOpenGLNativeWidget(parent) {
// 启用鼠标追踪(捕获鼠标移动事件)
setMouseTracking(true);
}
void CustomVTKWidget::mouseMoveEvent(QMouseEvent* event) {
// 获取鼠标在控件内部的坐标
QPoint pos = event->pos();
// 发送鼠标位置更新的信号
emit mousePositionChanged(pos.x(), pos.y());
// 调用父类的鼠标移动事件处理(保留默认行为)
QVTKOpenGLNativeWidget::mouseMoveEvent(event);
}
然后是主函数里
BmcApplication::BmcApplication(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// 中间无关代码省略...
// 创建自定义控件
CustomVTKWidget* customVTKWidget = new CustomVTKWidget(this);
// 替换 ui.openGLWidget
customVTKWidget->setGeometry(ui.openGLWidget->geometry()); // 自定义控件和原控件大小一致
customVTKWidget->setParent(this); // 将新控件设置为主窗口的子控件
// 隐藏原控件
ui.openGLWidget->hide();
// 删除原控件,避免内存泄漏
ui.openGLWidget->deleteLater();
// 更新指针
ui.openGLWidget = customVTKWidget;
connect(customVTKWidget, &CustomVTKWidget::mousePositionChanged, this, [this](int x, int y) {
ui.label_position_x->setText(QString("X: %1").arg(x)); // 用于显示坐标信息
ui.label_position_y->setText(QString("Y: %1").arg(y));
});
}
最后的结果: