它编译得很好,但这是我运行程序时的错误信息:
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
,如果我删除了额外的连接层,那么错误信息就会消失。
知道为什么这不起作用吗?
答案 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);