Использование QtCreator 5.3 для проекта Qt Quick UI, как связать ресурс кнопки QML с вызовом функции C

#qt #qml #qtquickcontrols

#qt #qml #qtquickcontrols

Вопрос:

Это мой первый пост о StackOverflow, поэтому, пожалуйста, извините за любые ошибки форматирования, которые я мог допустить.

Я создаю проект Qt Quick UI с использованием Qt Quick Controls 1.1, и в моем QML-коде есть простая кнопка, которую я хотел бы вызвать в своем классе действий C . Я вижу ряд примеров по этому поводу в более ранних версиях Qt, но, похоже, они не работают в 5.3. Я выбрал Qt Quick Controls 1.1 в настройках проекта. Я знаю, что это не должно быть слишком сложно сделать, но, похоже, я не могу найти примеры использования QtCreator 5.3

Вот мой файл main.qml:

 import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
        onTriggered: console.log("SEND")
    }

    Button {
        id: send
        text: "Send Request"
        action: actionSend
        signal sendSignal()
    }
}
  

Вот мой main.cpp:

 #include <QApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;

    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}
  

Вот класс action, в котором я хотел бы, чтобы кнопка QML вызывала «doSend»:

 #include<QDebug>
#include<QObject>

class Action : public QObject
{
    Q_OBJECT
public:
    Action();
public slots:
    void doSend();
};
  

Наконец, вот файл моего проекта:

 TEMPLATE = app

QT  = qml quick widgets

SOURCES  = main.cpp 
    action.cpp

RESOURCES  = qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

HEADERS  = 
    action.h
  

Когда я запускаю это, я вижу кнопку и вижу запись «ОТПРАВИТЬ» в консоль, поэтому я знаю, что действие QML настроено правильно. Любая помощь о том, как выполнить вызов Action в моем классе action, была бы высоко оценена!

Ответ №1:

Здесь вы сталкиваетесь с тремя проблемами.

Во-первых, вы не зарегистрировали свой Action класс с QML в main.cpp :

 int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    qmlRegisterType<Action>("StevesModule", 1, 0, "Action");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}
  

Во-вторых, действие является типом QML в модуле Qt Quick Controls. Он ничего не знает о вашем Action классе в C . Если вы хотите использовать свой Action класс вместо Action типа Qt Quick Controls, вы должны импортировать его в свой файл QML:

 import StevesModule 1.0
  

В-третьих, вы нигде не вызываете doSend() слот. Вы можете сделать это в обработчике onClicked кнопки:

 import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import StevesModule 1.0

ApplicationWindow {
    id: parentWnd
    visible: true
    width: 640
    height: 480

    Action {
        id: actionSend
    }

    Button {
        id: send
        text: "Send Request"
        onClicked: actionSend.doSend()
    }
}
  

Комментарии:

1. Спасибо, Митч, я на самом деле только что нашел более простой способ сделать то, что мне нужно, который я объясню в ответе. Я голосую за вас, потому что ваше решение также допустимо, и я извлек из него уроки. Спасибо!

2. По-видимому, я должен просто добавить комментарий. Вот что я сделал, и это тоже работает. Я нашел другой способ выполнить то же самое — сделать класс C доступным для корневого контекста движка приложения, например: engine.rootContext()->setContextProperty(«MyAction», новое действие()); Затем в файле qml я могу сделать: Action { id: actionSend onTriggered: MyObject.doSend() }

3. Извини, Митч, у меня, по-видимому, недостаточно очков репутации, чтобы проголосовать за тебя.

4. Не беспокойтесь. 🙂 setContextProperty Подход хорош, когда у вас есть один объект, и qmlRegisterType подход хорош, когда вы хотите создать множество элементов из QML.