【发布时间】:2016-10-26 15:05:46
【问题描述】:
我正在创建一个游戏,目前我遇到了 QML 问题。我需要让我的 C++ 线程等待用户做出决定,该决定将由某些 QML 组件(例如 MouseArea)接收。为了更好地演示这个问题,我编写了一些简单的代码来代表我正在尝试做的事情:
//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() 之前被调用。有人可以解释一下,为什么它不起作用以及如何处理这个问题?
【问题讨论】: