使用元数据类型转发信号/插槽

时间:2014-09-27 11:36:43

标签: c++ qt signals-slots

它编译得很好,但这是我运行程序时的错误信息:

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

第一部分运行正常,当我添加另一层(换句话说继电器)时,我收到了这条新的错误消息。所以这是有效的部分:

connect(&m_dataTestTab, SIGNAL(notifyAddGraph()),
                &m_dataTest, SLOT(createGraph()));

connect(&m_dataTest, SIGNAL(sendGraphData(QVector<double>,QVector<double>)),
                &m_dataTestTab, SLOT(drawGraph(QVector<double>,QVector<double>)));

此时设置如下:

Press a button -> create some data -> emit data back to the view and draw graph

我决定我想让上面的sendGraphData在一个线程上工作,所以在dataTest类中,我添加了这个额外的层,其中worker类在它自己的线程上,所以设置现在是:

Press a button -> notifies DataTest to launch a thread -> emit data from thread -> relay data from DataTest to the view -> draw my graph in the view

所以DataTest内的额外层有这个连接:

connect(m_worker, SIGNAL(sendGraphData(QVector<double>,QVector<double>)),
                this, SLOT(relaySendGraphData(QVector<double>,QVector<double>)));

然后是relaySendGraphData

void DataTest::relaySendGraphData(const QVector<double> &valueX, const QVector<double> &valueY)
    {
        qDebug() << valueX;
        emit sendGraphData(valueX, valueY); //should now connect up to the view
    }

这应该有效地将数据从线程(worker)发送到DataTest类,然后将其转发到DataTestTab(或视图),这样它就不必对线程一无所知。

它甚至没有输入relaySendGraphData,如果我删除了额外的连接层,那么错误信息就会消失。

知道为什么这不起作用吗?

1 个答案:

答案 0 :(得分:3)

试试这个:

qRegisterMetaType<QVector<double> >("QVector<double>");

编译正常,因为通常可以在运行时检测到信号和插槽的错误。

Doc:http://qt-project.org/doc/qt-4.8/qmetatype.html#qRegisterMetaType

所以你可以试试这个:

typedef QVector<double> MyArray;
// ... 
qRegisterMetaType<MyArray>("MyArray");
// ... 
connect(this, SIGNAL(signal(MyArray)),this, SLOT(slot(MyArray)),Qt::QueuedConnection);