2014-09-27 2 views
0

그것은 잘 컴파일,하지만 난 내 프로그램을 실행할 때이 나는 오류 메시지입니다 : 첫 번째 부분은 잘 실행중인릴레이 신호/메타 데이터 형식으로 슬롯

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 

나는, 나는 dataTest 클래스 내부에 있으므로 위의 sendGraphData이 스레드에서 작동하는 것을 원했다 나는 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 

을 그래서내부의 추가 레이어 relaySendGraphData 위해 그

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

을 :이 접속했습니다 다음 DataTestTab 이것을 중계 DataTest 클래스 스레드 (worker)로부터

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

이 효과적으로 방출해야 데이터 (또는 보기) 그래서 스레드에 대해 알 필요가 없었습니다.

심지어 relaySendGraphData을 입력하지 않아도 연결 레이어를 제거하면 오류 메시지가 사라집니다.

이것이 작동하지 않는 이유는 무엇입니까?

+1

을'connect' 당신을 알려줍니다 당신, 당신은'MetaObjectSystem'에''QVector 을 등록해야 AFAIK 그냥 뭐 @Chernobyl – Zaiborg

+0

을 게시 했으므로 생성자에게 그의 라인을 추가합니까? – fiz

+0

그것을 내 생성자에 추가하면 작동하고 네임 스페이스도 시도 할 것입니다 =) – fiz

답변

3

이 시도 : 보통 신호 슬롯에 오류가 런타임시에 검출 할 수 있기 때문에

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

잘 컴파일.

문서 : 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); 
+0

여기서 'worker'스레드 클래스와 그 이유는 무엇입니까? 신호/슬롯 부분 @Chernobyl – fiz

+0

에 넣어야합니까?이 여분의 레이어를 사용하기 전에 내 신호와 슬롯이 QVectors로 어떻게 작동합니까? – fiz