将固定大小的本征类型作为参数传递给Qt信号和时隙函数

时间:2015-02-09 15:20:36

标签: qt signals-slots eigen

这是Qt论坛的重复帖子:Qt forum thread

我需要在Qt信号和插槽功能中传递fixed-size vectorizable Eigen types。 请注意,信号和相应的插槽功能在需要QueuedConnection的不同线程中运行。因此,复制了信号函数中传递的参数。有关详细信息,请参阅此link

Qt声明参数可以通过值或const引用传递,信号槽将根据连接类型(QueuedConnection / DirectConnection)决定是否需要复制。

然而,Eigen声明Eigen对象必须通过引用传递,否则它是非法的或程序可能崩溃(在我的情况下:我有对齐问题的编译错误)。有关详细信息,请参阅此处:link

如果我通过const引用传递Eigen对象并使用qRegisterMetaType()在信号槽的connect()之前注册了Eigen对象,我也得到了编译错误。错误看起来像: 带有__declspec(align('16'))的实际参数将不会对齐

我还根据需求here编写了一个包含Eigen对象的包装类。不幸的是,同样的错误。

我的环境:Win7 64bit - VS2010 - Qt 5.3.1 - Eigen 3.2.4

有没有人在Qt信号槽功能中传递Eigen对象作为参数?你是怎么做到的。

更新(添加SSCCE): 如果你想克隆自己,我已经把它放在了主旨上: https://gist.github.com/f8af655a238ec136dbe9.git

// main.cpp
#include <QCoreApplication>
#include "A.h"
#include "B.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    A obj_a;
    B obj_b;

    qRegisterMetaType<eigen_wrapper>("eigen_wrapper");
    QObject::connect(&obj_a, &A::send, &obj_b, &B::receive);

    return a.exec();
}

// A.h
#pragma once

#include <QObject>
#include "eigen_wrapper.h"


class A : public QObject
{
    Q_OBJECT

private:
    eigen_wrapper eigen_object;

signals:
    // signal
    void send(const eigen_wrapper &);
};


// B.h
#pragma once
#include <QObject>
#include "eigen_wrapper.h"


class B : public QObject
{

    Q_OBJECT

private:
    eigen_wrapper eigen_object;

    public slots:

        inline void receive (const eigen_wrapper &s)
        {
            eigen_object = s;
        }
};


// eigen_wrapper.h
#pragma once
#include "Eigen/Dense"

class eigen_wrapper
{
    Eigen::Vector3f vec;
    Eigen::Quaternionf quat;

public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};

编译错误:

  

2&gt; ClCompile:2&gt; main.cpp中   2 - ; C:\ Qt的\ Qt5.3.1 \ 5.3 \ msvc2010_opengl \包括\ QtCore / qobjectdefs_impl.h(573):   错误C2718:&#39; const eigen_wrapper&#39;:实际参数with   __declspec(对齐(&#39; 16&#39;))不会被对齐2&gt; C:\ Qt的\ Qt5.3.1 \ 5.3 \ msvc2010_opengl \包括\ QtCore / qobjectdefs_impl.h(588)   :请参阅类模板实例化的引用   &#39; QtPrivate :: AreArgumentsCompatible&#39;正在编译2&gt;
  用2> [2] A1 = eigen_wrapper,2&gt;
  A2 = eigen_wrapper 2&gt; ] 2&gt;
  c:\ qt \ qt5.3.1 \ 5.3 \ msvc2010_opengl \ include \ qtcore \ qobject.h(228):见   对类模板实例化的引用   &#39; QtPrivate :: CheckCompatibleArguments&#39;正在编译2&gt;
  用2> [2] List1 = QtPrivate :: List,2&gt; List2 = QtPrivate :: List 2&gt; ] 2&gt; .. \ main.cpp(14):看   引用函数模板实例化&#39; QMetaObject :: Connection   QObject :: connect(const A.   *,Func1,const B ,Func2,Qt :: ConnectionType)&#39;正在编译2&gt;用2> [2] Func1 = void(__thiscall A :: )(const   eigen_wrapper&amp;),2&gt; Func2 = void(__ thishisall B :: *)(const   eigen_wrapper&amp;)2&gt; ] 2&gt; 2&gt; Build FAILED。

非常感谢, 林

1 个答案:

答案 0 :(得分:0)

根据错误讨论持续了几年: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=83

他们在以下环境中测试了Eigen: - MSVC9,MSVC10,MSVC11,x64 - >作品(错误不会显示) - MSVC11 x32 - &gt;作品。 - MSVC9,MSVC10,x32 - >失败。

作为一种解决方法,我把

#define EIGEN_DONT_ALIGN_STATICALLY
在任何包括Eigen标题之前

现在代码编译并正常运行。