Qt: Как использовать слоты, когда объект создается в функции класса - PullRequest
0 голосов
/ 20 июня 2020

Я быстро изучаю Qt и хочу создать танковую игру. Я создаю компоненты QML с помощью C ++ динамически. Он отлично работает, пока я не использую сигналы QML для подключения слотов C ++. Когда QML излучает сигнал, C ++ не принимает его и не выполняет функцию.

Следующий код упрощен.

main. cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    GameMap map;
    map.generateMap();

    return app.exec();
}

gamemap . cpp

void GameMap::generateMap()
{
    Player player;
    player.generate(&view);

    //QEventLoop loop; //it works when I add these code, but still causes some problems. So I'm wondering if there is other solution?
    //loop.exec();
}

игрок. cpp

void Player::generate(View *view)
{
    QQmlComponent component(view.engine(),QUrl("qrc:/Player.qml"));
    QObject *myObject=component.create();
    QQuickItem *item=qobject_cast <QQuickItem*>(myObject);
    QQmlEngine::setObjectOwnership(item, QQmlEngine::CppOwnership);
    item->setParentItem(view.rootObject());
    item->setParent(&view);
    QObject::connect(item,SIGNAL(queryCppFun(QString)),this,SLOT(queryFunction(QString)));
}

void Player::queryFunction(const QString &funName)
{
    if(funName=="destroy")
        qDebug()<<funName;
}

Player.qml

signal queryCppFun(string funName);
function initDestroy(){
    queryCppFun("destroy");
}

1 Ответ

0 голосов
/ 20 июня 2020

Хорошо, я знаю, как с этим делать.

Просто поставьте stati c перед Player player;

И не обрабатывайте элементы QML в C ++, спасибо @ folibis

...