【问题标题】:How to make C++ wait for user input from QML如何让 C++ 等待来自 QML 的用户输入
【发布时间】: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() 之前被调用。有人可以解释一下,为什么它不起作用以及如何处理这个问题?

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

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

    不要试图循环,只要记住你是在一个事件驱动的系统中。 只需对信号做出反应。

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

    【讨论】:

    • 好建议:我们生活在一个异步发生的世界,这也反映在软件的工作方式上。代码应该对事物做出反应,而不是等待它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多