Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
QML Qt / Qml / 5_Богатства QML на службе приложения Qt.doc
Скачиваний:
114
Добавлен:
28.03.2016
Размер:
760.83 Кб
Скачать

Еще немного о методе setContextProperty()

До сих пор мы использовали метод setContextProperty() для передачи указателя на созданные нами объекты со свойствами. Но его возможности гораздо шире. Прежде всего, отметим, что существует и другой вариант метода setContextProperty():

void setContextProperty ( const QString & name, const QVariant & value )

То есть, со свойством контекста QML можно связать не только объект, но и любое значение, приводимое к типу QVariant. Например:

qmlView->rootContext()->setContextProperty("HelloText", trUtf8("Hello World!");

Объекты, которые мы передаем контекстам, могут экспортировать в QML не только свойства, но и методы. Для того чтобы модуль QML увидел метод объекта, этот метод должен быть объявлен в разделе public slots. Например, если добавить в класс Dial метод

public slots:

int angleToPos(int angle)

{

...

}

Собираем информацию об ошибках

Поскольку наша сложная конструкция QML может нуждаться в отладке, в программе предусмотрен способ вывода информации об ошибках, которые возникают в ходе выполнения программы на QML. Вообще-то, в ОС Linux все сообщения об ошибках QML выводятся в стандартный поток вывода той консоли, с корой была запущена программа. В ОС Windows Qt этого почему-то не делает: даже если запустить программу из окна командной строки Windows, никаких сообщений об ошибках мы не увидим (даже если ошибки есть). В любом случае, наше приложение графическое, и его не обязательно будут запускать из окна консоли, так что неплохо обзавестись собственным методом вывода информации об ошибках, основанном на графическом интерфейсе.

Список актуальных ошибок возвращается методом errors() QML-виджета в виде объекта

QList<QDeclarativeError>;

Объект класса QDeclarativeError включает несколько свойств и методов, из которых мы воспользуемся методом toString(). Этот метод возвращает информацию об ошибке на человеческом языке в переменной QString:

errors = qmlView->errors();

for(int i = 0; i < errors.count(); i++)

MessageBox::critical(this, "QML Error", errors.at(i).toString());

Где errors – объект указанного выше класса, производного от QList.

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

В связи с этим полезно сравнить вывод программы на консоль Linux (куда поступает информация обо всех ошибках) с нашим выводом с помощью класса MessageBox. Таким образом, например, я узнал, что связывать корневой контекст с объектом dial лучше до загрузки текста программы QML, ведь выполнение программы начинается немедленно после вызова метода setSource(). Если сразу после вызова setSource() программа на QML не сможет инициализировать свой объект Dial, это вызовет ошибку, которая, однако будет устранена, как только мы укажем программе, чем именно следует инициализировать этот объект. Иначе говоря, инициализировать корневой контекст можно и до вызова setSource(), и после этого вызова, но первый способ работает чище.