gpt4 book ai didi

qt - 如何发送包含 cv::Mat 的 Qt 信号?

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:30 25 4
gpt4 key购买 nike

简而言之,我得到以下错误:

QObject::connect: Cannot queue arguments of type 'cv::Mat'
(Make sure 'cv::Mat' is registered using qRegisterMetaType().)

我想做的是将包含两个 cv::Mat 图像的信号从 QThread 发送到主线程,以便我可以显示输出。没有编译时错误,但是当我运行程序时,它卡在 qglobal.h ( inline void qt_noop() {}) 的断点处。

我尝试添加 Q_DECLARE_METATYPE(cv::Mat)代码,无济于事。我对现在该做什么一无所知。

代码

在 QThread 类中:

signals:
void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye);

void eyesDriver::run()
{
forever
{
flow->draw(leftEye, rightEye);
sndFlow(leftEye, rightEye);
}
}

在 QObject 类中捕获:

public slots:
void recFlow(cv::Mat &leftEye, cv::Mat &rightEye);

void myClass::recFlow(cv::Mat &leftEye, cv::Mat &rightEye)
{
cv::imshow("left", leftEye);
cv::imshow("rigth", rightEye);
cv::waitKey(40);
}

主要内容:

Q_DECLARE_METATYPE(cv::Mat)
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qRegisterMetaType< cv::Mat >("cv::Mat");
// create objects from QThread and QObject class
QObject::connect(&qthread, SIGNAL(sndFlow(cv::Mat&,cv::Mat&)),
&qobject, SLOT(recFlow(cv::Mat&,cv::Mat&)));
qthread.start();
return a.exec();
}

将信号槽变量更改为 QSharedPointer< cv::Mat >也不起作用。给出同样的错误:

QObject::connect: Cannot queue arguments of type 'QSharedPointer<cv::Mat>'
(Make sure 'QSharedPointer<cv::Mat>' is registered using qRegisterMetaType().)

作品

好吧,看来可以了。我搬家了 qRegisterMetaType< cv::Mat >("cv::Mat");就在 QObject::connect 之前称呼。但是,我仍然必须“F5”越过 qglobal.h 中的断点,之后它会起作用。

我可能错了,但似乎 qRegisterMetaType 的位置不是微不足道的。

最佳答案

您需要调用qRegisterMetaType除了宏(或取而代之,取决于您的需要)。这是信号能够跨线程编码数据所必需的。但是,如果您使用 QObject 层次结构来管理对象生命周期,那么通过引用或智能指针或原始指针传递可能是一个更明智的想法。

关于qt - 如何发送包含 cv::Mat 的 Qt 信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com