Использование метода сигнала и слота в QML для загрузки другой страницы в функцию main ()

Невозможно определить список воспроизведения, используя только тег или , но есть способы их управления, поэтому вы можете имитировать список воспроизведения с использованием JavaScript. Ознакомьтесь с разделами 4.8.7, 4.8.9 (особенно 4.8.9.12) спецификации HTML5 . Надеемся, что большинство методов и событий реализовано в современных браузерах, таких как Chrome и Firefox (последние версии, конечно).

0
задан Andrew Fan 5 March 2019 в 04:18
поделиться

2 ответа

Ваша первая ошибка заключается в том, что вы думаете, что окно, созданное с помощью 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 не следует изменять.

0
ответ дан eyllanesc 5 March 2019 в 04:18
поделиться

Наиболее очевидная проблема с кодом заключается в том, что вы никогда не используете экземпляр secondpage, который вы создаете, и connect() для. Ни QQuickView, в котором он создан. QQmlApplicationEngine - это место, где вы загружаете и показываете свой main.qml, а внутри вы создали совершенно новый экземпляр secondpage.

Предполагая, что у вас есть законная причина для использования промежуточного класса HandleTextField (вместо простого подключения ваших сигналов / слотов QML непосредственно в QML без C ++), я бы предложил альтернативную стратегию. Похоже, вы прочитали хотя бы некоторые из Взаимодействующих с объектами QML из C + , но обратите особое внимание на предупреждение , отображаемое в этой специфической части:

[1115 ] Предупреждение. Хотя существует возможность доступа к объектам QML из C ++ и манипулирования ими, этот подход не рекомендуется, за исключением целей тестирования и создания прототипов. ...

Чтобы исправить существующий код (если в конце концов выберите этот маршрут):

main.qml

ApplicationWindow {
    id: applicationWindow1
    StackLayout {
        id: swipeView
        ...
        Secondpage {
            objectName: "mySecondPage"  // add an object name
        }
    }
    ...
}

main.cpp

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();
}
[1119 ] Примечание: код не проверен. Проверьте все предупреждения от Qt на stderr (консоль), чтобы убедиться, что эти операции connect() действительно успешны. Другая проблема с этим подходом заключается в том, что соединения Qt «старого стиля» могут быть проверены только во время выполнения (в отличие от «нового стиля», проверенного во время компиляции), и вы увидите предупреждение, только если вы активно просматриваете [1111 ] выход. Но это единственный способ подключения к сигналам / слотам QML.

0
ответ дан Max Paperno 5 March 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: