2016-10-10 10 views
-1

Я создал приложение Hello World в QML. Теперь я хочу узнать, как изменить текст из «Hello World» на «Goodbye World» из C++.QML C++ До свидания Мир

QML выглядит так:

import QtQuick 2.6 

Rectangle { 
    property alias mouseArea: mouseArea 

    width: 360 
    height: 360 

    MouseArea { 
     id: mouseArea 
     anchors.fill: parent 
    } 

    Text { 
     id: helloText 
     anchors.centerIn: parent 
     text: "Hello World" 
    } 
} 

Я пытался следовать

https://wiki.qt.io/Introduction_to_Qt_Quick#Integration_with_C.2B.2B_applications

но не повезло. Код кажется неполным. Например, он кончает информацию с эллипсов, как так:

QDeclarativeContext *context = …; 

И я не могу найти для заголовка QDeclarativeContext, даже если он не сделал. Я подозреваю, что документация устарела, но я не уверен.

В любом случае, я просто хочу увидеть простой пример, который позволяет мне изменить текст из «Hello World» на «Goodbye World» изнутри программы на C++.

ответ

2

Этот код предназначен для старого API QtQuick1, который был основан на QGraphicsScene и теперь устарел, устарел и IIRC удален из Qt.

Я бы рекомендовал не смешивать с QML с C++, я бы даже пошел дальше и назвал его анти-шаблоном, в 99,9999% случаев есть лучшее решение. Вы должны поддерживать взаимодействие между C++ и QML с хорошо определенным API.

Это, как говорится, все еще можно найти объекты и управлять их свойствами. Вы можете использовать QQmlApplicationEngine::rootObjects(), чтобы получить доступ к корневым объектам, оттуда вы можете findChild() любой объект, который вы предоставили objectName со стороны QML, вы можете использовать QMetaObject:invokeMethod() (работает также для функций QML!), Используйте qobject_cast, задайте свойства и еще что-то.

Все эти методы: covered in the documentation.

+0

Я смущен вашим комментарием «Я бы рекомендовал не смешивать QML с C++». Вы хотите сказать, что не рекомендуете изменять отображение пользовательского интерфейса на C++? Термин «смешение» для меня неясен. – Mitch

+0

@Mitch - я имею в виду «найти объект и делать для него случайные вещи» - взаимодействие между двумя слоями должно быть ограничено сигналами, слотами и свойствами. В хорошо спроектированном API не было бы необходимости вообще общаться с графическим интерфейсом с C++. – dtech

+0

Ваш код на C++ должен быть хорошо инкапсулированным классам, которые вы просто «подключаете» к QML с помощью сигналов, слотов и свойств, вам нужна хорошая изоляция и разделение между логикой C++ и графическим интерфейсом QML с четко определенным интерфейсом для межсоединения. Держите вещи там, где они принадлежат, иначе вы создадите плохой дизайн и предложите проблемы. – dtech

Смежные вопросы