2016-10-26 2 views
1

게임을 만들고 있는데 현재 QML에 문제가 있습니다. 내 C++ 스레드가 사용자가 어떤 QML 구성 요소 (예 : MouseArea)에 의해 수신 될 것인지 결정할 때까지 기다려야합니다. 더 나은 문제를 설명하기 위해 내가 할 노력하고있어 나타냅니다 몇 가지 간단한 코드를 작성했습니다 :QML에서 사용자 입력 대기 C++ 작성 방법

//main.cpp 
#include <QApplication> 
#include "someclass.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    SomeClass c; 

    return a.exec(); 
} 

//someclass.h 
#ifndef SOMECLASS_H 
#define SOMECLASS_H 

#include <QQuickView> 
#include <QQuickItem> 
#include <QObject> 

class SomeClass : public QObject 
{ 
    Q_OBJECT 
public: 
    SomeClass(); 

    void lock(); 

public slots: 
    void unlock(); 

private: 
    QQuickView view; 
    bool unlockSignalReceived; 
}; 

#endif // SOMECLASS_H 

//someclass.cpp 
#include "someclass.h" 

SomeClass::SomeClass() 
{ 
    view.setSource(QUrl("qrc:/QMLFile.qml")); 
    view.setGeometry(0,0,1000,1000); 
    view.show(); 
    unlockSignalReceived=1; 
    QObject::connect(view.rootObject(), SIGNAL(click()),this, SLOT(unlock())); 
    lock(); 
    QMetaObject::invokeMethod(view.rootObject(), "changeColor", Q_ARG(QVariant, "green")); 
} 

void SomeClass::lock() 
{ 
    unlockSignalReceived=0; 
    while (!unlockSignalReceived); 
} 

void SomeClass::unlock() 
{ 
    unlockSignalReceived=1; 
} 

//qmlfile.qml 
import QtQuick 2.5 

Item { 
    id: root 

    anchors.fill: parent 

    function changeColor(color) 
    { 
     rec.color = color; 
    } 

    signal click() 

    Rectangle{ 
     id: rec 

     anchors.fill: parent 

     color: "red" 
    } 
    MouseArea{ 
     id: mArea 

     anchors.fill: parent 

     onClicked: click() 
    } 
} 

나는 그것이 사용자가 클릭하면 색상을 변경, 빨간색 사각형을 표시해야한다고 생각 녹색으로. Qt GUI가 C++ 논리 스레드와 다른 스레드에서 실행된다는 것을 기억하고 있으므로 lock() 실행 중 unlock() 슬롯을 실행할 수 있어야합니다. 그러나 그것이 효과가 없다면, 아마 나는 완전히 틀리다. 무엇보다 흥미로운 점은 view.setSource (QUrl)가 lock() 전에 호출 되기는하지만 사각형이 보이지 않는다는 것입니다. 누군가가 설명 할 수 있습니까, 왜 작동하지 않으며 어떻게이 문제를 다루는가?

답변

2

단일 스레드 응용 프로그램에 있고 스레드가 종료되지 않는 루프를 실행합니다.

이벤트 구동 형 시스템에 있다는 것을 기억하는 대신 루프를 반복하십시오. 신호에 반응하십시오.

Btw, QML 코드에서 C++에 대한 의존성을 피하는 것이 더 좋으므로 루트 객체를 검색하고 신호에 연결하여 해당 함수를 호출하는 대신 C++ 객체를 노출하고 QML 코드에서 C++을 호출하게하십시오 논리. QQmlContext::setContextProperty(QString, QObject*)

+1

좋은 조언 : 우리는 사물이 비동기 적으로 발생하는 곳에서 살고 있으며, 이는 소프트웨어의 작동 방식에도 반영됩니다. 코드는 사물에 반응해야하며 기다리지 않아야합니다. –