#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.