2013-08-02 8 views
4

원본 코드가 신호에서 슬롯으로 QStringList를 전달한 다음 QList를 반환했습니다. 다 잘 작동했지만 QStringList와 QList를 모두 두 개의 서브 클래 싱 된 QObject로 변경해야했습니다. 그때 이후로 나는 "합성 된 방법이 처음 여기에 필요합니다"와 같은 오류를 받았거나 단순히 오류 메시지없이 충돌합니다.qtject를 Qt의 신호에서 슬롯으로 인수로 전달하는 방법

qt는 대기중인 연결에서 전달 된 모든 인수를 복사하고 qobject는 복사 할 수 없다는 것을 알고 있습니다. 따라서 q 객체를 반환하는 대신 신호를 방출하기 전에 두 객체를 모두 만들 것이라고 생각했습니다. 그런 다음 각 객체에 대한 참조를 전달하고 슬롯 함수에서 그 중 하나를 수정하고 반환 값을 무효화합니다. 불행히도 앱은 신호 및 슬롯 기능을 코딩하는 방법에 관계없이 여전히 충돌합니다. 신호/슬롯 함수를 어떻게 코딩하고 이들을 연결하여 두 qobject를 인수로 전달하거나 qobject를 반환 할 수 있습니까?

MyQObject1 obj1("a","b","c"); 
MyQObject2 obj2(); 
emit sendSignal(&obj1, &obj2); 
// or 
MyQObject2 obj2 = emit sendSignal(&obj1); 

connect(someObj, SIGNAL(sendSignal(const QObject&)), this, SLOT(receiveSignal(const QObject&))); 

receiveSignal() 함수는 qobject를 직접 만들거나 수정하지 않습니다. qobjects를 먼저 다른 함수로 전달해야합니다.이 함수는 obj2를 수정하거나 생성하고 반환합니다. 모든 코드 예제는 크게 감사하겠습니다.

답변

9

일반적으로 QObject은 참조가 아닌 포인터로 전달됩니다 (QObject은 복사 할 수 없으며 값으로 전달할 수 없습니다). QObject*은 기본적으로 메타 유형으로 등록됩니다. 투광

connect(this, SIGNAL(test_signal(QObject*)), this, SLOT(test_slot(QObject*))); 

:

private slots: 
    void test_slot(QObject* object); 

signals: 
    void test_signal(QObject* object); 

초기화 : 그래서 신호와 QObject* 인수 슬롯을 만드는 것은 그들에게 일을 얻기 위해 충분한 물론

QObject* object = new QObject(); 
emit test_signal(object); 

신호와 슬롯 수 다른 수업에 참여하십시오.

+1

연결이 * 대기열에 저장되어 있지 않으면 신호/슬롯에 대한 메타 유형 등록이 필요 없습니다. 대기열에 연결되어 있으면 객체에 대한 소유권 문제가 발생합니다. 누가 그것을 소유하고 그것을 다시 삭제할 것인가? 이미 터? 언제? –

+0

'QObject *'는 일반적인 메타 타입입니다. 기본적으로 등록되며 일부 내장 신호 (예 :'파괴됨 ')에 의해 사용됩니다. 대기 연결은 등록 없이도 작동합니다. 'QObject'의 소유권은 부모를 설정함으로써 선언됩니다 (스택에 생성되지 않은 경우). 포인터로 전달하면 일반적으로 소유권 문제가 발생하지 않으며 Qt API에서 널리 사용됩니다. 일반적으로 메소드 (슬롯)가 호출 될 때 소유권에 관한 정보를 알려주는 API 규칙이 있습니다. –

+0

메타 타입 : 나는 그것이 내 요점이 아니라는 것을 안다. QObject *는 메타 타입으로 등록되어 있으므로 신호/슬롯에서 사용할 수 있습니다. 그것은 의무적 인 것은 아니지만; 만약 그렇다면,'MyObjectSubclass *'의 인자를 전달하는 것은'MyObjectSubclass * '를 등록하지 않고 이미 실패 할 것이다. –

관련 문제