게임을 만들고 있는데 현재 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() 전에 호출 되기는하지만 사각형이 보이지 않는다는 것입니다. 누군가가 설명 할 수 있습니까, 왜 작동하지 않으며 어떻게이 문제를 다루는가?
좋은 조언 : 우리는 사물이 비동기 적으로 발생하는 곳에서 살고 있으며, 이는 소프트웨어의 작동 방식에도 반영됩니다. 코드는 사물에 반응해야하며 기다리지 않아야합니다. –