gpt4 book ai didi

c++ - 如何让 C++ 等待来自 QML 的用户输入

转载 作者:行者123 更新时间:2023-11-30 03:37:18 27 4
gpt4 key购买 nike

我正在创建游戏,目前我遇到了 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() 槽。但如果它不起作用,那么我可能就完全错了。更有趣的是,矩形甚至没有显示,尽管在 lock() 之前调用了 view.setSource(QUrl)。有人可以解释为什么它不起作用以及如何处理这个问题吗?

最佳答案

您在一个单线程应用程序中,您的线程执行一个永不结束的循环。

与其试图循环,不如记住你在一个事件驱动的系统中。只需对信号使用react。

顺便说一句,避免在 QML 代码上为 C++ 创建依赖关系要好得多,因此与其检索根对象、连接到其信号并调用其函数,不如公开 C++ 对象并让 QML 代码调用 C++ 逻辑.参见 QQmlContext::setContextProperty(QString, QObject*)

关于c++ - 如何让 C++ 等待来自 QML 的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com