Невозможно определить список воспроизведения, используя только тег или
, но есть способы их управления, поэтому вы можете имитировать список воспроизведения с использованием JavaScript. Ознакомьтесь с разделами 4.8.7, 4.8.9 (особенно 4.8.9.12) спецификации HTML5 . Надеемся, что большинство методов и событий реализовано в современных браузерах, таких как Chrome и Firefox (последние версии, конечно).
Ваша первая ошибка заключается в том, что вы думаете, что окно, созданное с помощью QQuickView, является тем же, которое создано в main.qml, потому что нет, это 2 разных объекта.
Существует 2 подхода для взаимодействия QML и C ++:
Извлечение ссылок из QML : это подход, который вы хотите реализовать, но у него много неудобств, потому что поиск объекта осуществляется с использованием, например, имени объекта, которое вы не использовали, кроме того, что в сложных структурах его сложно или невозможно получить, кроме того, что многие объекты QML создаются и уничтожаются тем, какой объект вы получаете в другой раз я могу указать на незарезервированную память, плюс есть зависимость кода C ++ от QML, поэтому этот метод не самый лучший и не рекомендуется.
Перенос ссылок на QML : у этого подхода нет проблем, поскольку при экспорте объекта с использованием setContextProperty объект виден во всех QML, поскольку он является глобальным, поэтому, если объект QML создан или его устранение не вызовет проблем, подобных предыдущему методу, нам не нужно имя объекта, и соединение устанавливается так, как если бы объект был создан в QML.
С учетом вышеизложенного я буду использовать второй подход:
main.cpp
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
HandleTextField handleTextField;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("handleTextField", &handleTextField);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
Secondpage.qml [1117 ]
Item{
Connections{
target: handleTextField
onSetTextField: textField1.text = text // <---
}
visible: true
width: 360
height: 360
TextField {
id: textField1
x: 31
y: 169
placeholderText: qsTr("Enter some text...")
}
Button {
x: 193
y: 167
text: qsTr("Uppercase me!")
onClicked: handleTextField.handleSubmitTextField(textField1.text) // <---
}
}
main.qml не следует изменять.
Наиболее очевидная проблема с кодом заключается в том, что вы никогда не используете экземпляр secondpage
, который вы создаете, и connect()
для. Ни QQuickView
, в котором он создан. QQmlApplicationEngine
- это место, где вы загружаете и показываете свой main.qml
, а внутри вы создали совершенно новый экземпляр secondpage
.
Предполагая, что у вас есть законная причина для использования промежуточного класса HandleTextField
(вместо простого подключения ваших сигналов / слотов QML непосредственно в QML без C ++), я бы предложил альтернативную стратегию. Похоже, вы прочитали хотя бы некоторые из Взаимодействующих с объектами QML из C + , но обратите особое внимание на предупреждение , отображаемое в этой специфической части:
[1115 ] Предупреждение. Хотя существует возможность доступа к объектам QML из C ++ и манипулирования ими, этот подход не рекомендуется, за исключением целей тестирования и создания прототипов. ...blockquote>
Чтобы исправить существующий код (если в конце концов выберите этот маршрут):
main.qml
ApplicationWindow { id: applicationWindow1 StackLayout { id: swipeView ... Secondpage { objectName: "mySecondPage" // add an object name } } ... }
main.cpp
[1119 ] Примечание: код не проверен. Проверьте все предупреждения от Qt наint main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; // First load the main QML file, which also loads the Secondpage item you want to access. engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; HandleTextField handleTextField; // Here we find the "Secondpage" item loaded into main.qml by its objectName property QObject *item = engine.rootObjects().first()->findChild<QObject *>("mySecondPage"); if (item) { QObject::connect(item, SIGNAL(submitTextField(QString)), &handleTextField, SLOT(handleSubmitTextField(QString))); QObject::connect(&handleTextField, SIGNAL(setTextField(QVariant)), item, SLOT(setTextField(QVariant))); } return app.exec(); }
stderr
(консоль), чтобы убедиться, что эти операцииconnect()
действительно успешны. Другая проблема с этим подходом заключается в том, что соединения Qt «старого стиля» могут быть проверены только во время выполнения (в отличие от «нового стиля», проверенного во время компиляции), и вы увидите предупреждение, только если вы активно просматриваете [1111 ] выход. Но это единственный способ подключения к сигналам / слотам QML.