Реклама

Поиск

QML - Урок 013. Позиционирование в QML с якорями ( Anchors )

TutorialQMLanchors, left, right, bottom, top, centerIn, Qt, QML226

В дополнение к более традиционным Grid, Row, Column, Qt Quick также предоставляет функционал для элементов слоёв, использующий концепцию якорей ( Anchors ). Каждый элемент может быть рассмотрен, как имеющий набор из 7 невидимых "якорных линий":

  • left;
  • horizontalCenter;
  • right;
  • top;
  • verticalCenter;
  • baseline;
  • bottom.

Baseline ( на данном рисунке) соответствует воображаемой линии, на которой помещается текст. Для элементов без текста это соответствует линии top.

QML - Урок 023. Охота за багами при передаче указателя на QObject в QML

TutorialQMLQt, QML, указатель, JavaScriptOwnership, pointer, bug100

Одними из самых мерзких и мало предсказуемых багов являются те, которые возникают в неопределённый момент времени. К числу таких можно отнести баг, который проявляется при передаче указателя на QObject в QML слой. Проблема заключается в том, что если у QObject отсутствует родитель, то при передаче в слой QML происходит смена владельца объекта, то есть ему устанавливается JavaScriptOwnership. В итоге, когда в QML слое пропадут все ссылки на данный объект, то он будет удалён сборщиком мусора QML. Соответственно, все ссылки в C++ слое окажутся невалидными. А приложение при попытке обращения по этим ссылкам молча схлопнется, ничего не сообщив о причине краха.

Говоря о неопределённости срабатывания бага, необходимо отметить, что эта неопределённость произрастает из момента сборки мусора. В обычном варианте этот момент может наступить тогда, когда программа откушает пару гигабайт памяти или когда памяти будет не хватать и её можно будет получить, произведя сборку мусора. То есть приложение может без проблем работать достаточно долго без проявления бага, и даже возможно пережить несколько версий, прежде чем баг проявится у какого-нибудь пользователя, который решит сообщить об этом разработчикам.

Стоит отметить, что данное правило не будет применяться к объектам объявленным в качестве Q_PROPERTY.

Но для демонстрации проблемы можно воспользоваться QML функцией gc() , которая ускорит сборку мусора.

Реклама

QML - Урок 014. GridLayout QML - Позиционирование элементов

TutorialQMLGridLayout, Qt, QML, ячейка, cell, row, column173

Небольшая заметка, родившаяся из вопроса одного из постоянных читателей сайта. При разработке интерфейса приложения под QML для позиционирования объектов в GridLayout необходимо использовать функционал вложенных свойств Layout. Таких как:

  • Layout.row - указывает строку, в которой располагается объект;
  • Layout.column - указывает колонку, в которой располагается объект;
  • Layout.rowSpan - указывает, на сколько строк должен быть растянут объект;
  • Layout.columnSpan - указывает, на сколько колонок должен быть растянут объект;
  • Layout.minimumWidth - минимальная ширина объекта в слое;
  • Layout.minimumHeight - минимальная высота объекта в слое;
  • Layout.preferredWidth - предпочтительная ширина объекта в слое;
  • Layout.preferredHeight - предпочтительная высота объекта в слое;
  • Layout.maximumWidth - максимальная ширина объекта в слое;
  • Layout.maximumHeight - максимальная высота объекта в слое;
  • Layout.fillWidth - заполнение по ширине;
  • Layout.fillHeight - заполнение по высоте;
  • Layout.alignment - выравнивание в слое;

QML - Урок 015. Разработка QML Data Mapper - Аналог QDataWidgetMapper

TutorialQMLQML, Qt, QDataWidgetMapper, mapper, QMLDataMapper97

В процессе переноса GUI одной софтины с QWidgets на QML обнаружилось отсутствие аналога QDataWidgetMapper для QML . Данный факт был несколько портящим настроение. Но делать было нечего, кроме как искать другие способы реализации или делать полностью свой велосипед для этого, свой Qml Data Mapper.

Тем не менее поиски на просторах сети дали свои результаты в качестве примера 2011 года от разработчиков Nokia по реализации SQL Widget Mapper для BlackBerry на основе Cascades (фреймворка для native разработки на QML Qt под BlackBerry, соответственно). Путём вечерней медитации над данным примером удалось перепилить код для нынешнего QML Qt , который вполне неплохо будет чувствовать себя как при работе под Desktop, так и при работе под Android, (кроссплатформенность как ни как).

Для демонстрации работы QML Data Mapper будет написано приложение, которое работает с базой данных SQLite. При каждом запуске приложение записывает несколько строк в базу данных, из которой данные забираются при помощи модели данных наследованной от QSqlQueryModel и отображаются в QML TableView. В главном окне приложения присутствует кнопка, по нажатию которой вызывается диалоговое окно, в котором отображается информация о первой строке таблицы. При двойном клике по одной из строк таблицы также вызывается диалоговое окно, но с информацией об этой строке. Также в диалоговом окне присутствуют кнопки для пролистывания информации из таблицы.

QML - Урок 021. Переключение между окнами в QML

TutorialQMLQt, QML, window, Quick, Controls, QtQuick184

В одной из статей довелось ответить на вопрос читателя, как реализовать переключение между окнами в Qt , так, чтобы при переключении неактивное окно скрывалось. По нажатию специальной кнопки открываем второе окно, а первое закрываем. И переключаемся обратно аналогичным образом.

А теперь задали тот же вопрос, но уже применительно для QML. Итак, посмотрим, как это реализовать на QML.

Структура проекта

  • question4.pro - профайл проекта, создаётся по умолчанию и не изменяется;
  • main.cpp - основной файл исходных кодов, создаётся по умолчанию и не изменяется;
  • main.qml - основной файл qml с главным окном приложения;
  • AnotherWindow.qml - тип второстепенных окон проекта.

AnotherWindow.qml

Пояснение кода начну с второстепенного окна приложения, поскольку передача информации о нажатии кнопки для открытия основного окна приложения реализуется с помощью сигнала. И удобнее будет описать этот момент в начале, прежде чем приступить к основному коду приложения.

Реклама

QML - Урок 017. Экспорт данных в формат CSV из модели данных в QML Qt

TutorialQMLQML, Qt, CSV, EXCEL133

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

Например, в статье по работе с базой данных SQLite в приложении на QML была создана база данных, в которую добавлялись данные и удалялись из неё. При этом они отображались в TableView , который был уже частью интерфейса, написанного на QML. А для отображения этой таблицы использовалась модель данных, наследованная от QSqlQueryModel .

Предлагаю воспользоваться исходниками того проекта и расширить его так, чтобы в приложении имелась кнопочка для экспорта данных в файл формата CSV .

Что такое формат CSV

CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятой ( , ). Однако, большинство программ вольно трактует стандарт CSV и допускают использование иных символов в качестве разделителя.

Вообще суть работы сведётся к тому, чтобы сделать метод в нашей модели данных, который будет дергать данные из этой модели и разделять точкой с запятой каждую ячейку в строке, а каждую строку разделять символом новой строки "\n".

Игра на QML - Урок 1. Игровая арена и динамические объекты

TutorialQMLJavaScript, QML, Qt, динамические объекты, игровая арена266

После первого опыта по написанию игры на Qt под Android, хочу поделиться этим опытом и предлагаю вместе написать простенькую игру в стиле "Убей крота". Это игра, в которой нужно успевать попадать по кротам, которые вылазят из нор, но учитывая, что это будет упрощённая игра, то вместо кротов используем круглые мишени, которые будут появляться на игровом поле. В качестве игрового поля будет использовать сетку 6 на 6 ячеек. Но для создания поля не будет использоваться какой-то специальный объект, типа GridLayout . В игровом поле сетка будет формироваться из количества строк, колонок и длины стороны квадратной ячейки. Данные о заполненности ячейки будут храниться в двумерном массиве, который будет сформирован в javascript составляющей (на забываем, что QML - это декларативный JSON-подобный язык с поддержкой javascript).

Структура проекта

Проект состоит из следующих файлов:

  • TargetGame.pro - профайл проекта;
  • deployment.pri - файл сборки и деплоя проекта;
  • main.cpp - файл с main функцией проекта;
  • main.qml - основной файл QML-слоя с объектом главного окна приложения;
  • Target.qml - файл QML с описанием объекта мишени;
  • Target.png - внешний вид мишени является png рисунком;
  • GameArea.qml - игровая арена с сеткой для размещения мишеней;
  • logic.js - файл с javascript логикой игры.

Изучим содержание лишь тех файлов, которые отличаются от содержания по умолчанию при создании проекта.

Qt/C++ - Урок 059. Требуется ли удалять QStandardItem из памяти вручную при вызове метода clear в модели данных?

TutorialQtQStandardItem, QStandardItemModel154

При работе с таблицами, да и вообще с различными данными в C++ требуется контроль над удалением, чтобы не было утечек памяти. Но требуется ли такой тотальный контроль при удалении объектов QStandardItem помещённых в QStandardItemModel , у которой вызвали метод clear ?

Такой вопрос может возникнуть исходя из того, каким образом обычно добавляются объекты QStandardItem в QStandardItemModel, а именно:

QList<QStandardItem *> items;
items.append(new QStandardItem("Item 1"));
items.append(new QStandardItem("Item 2"));
items.append(new QStandardItem("Item 3"));
model->appendRow(items);

И так далее в цикле для заполнения необходимого числа строк. При этом указатели на данные объекты нигде в коде больше не фигурируют и не удаляются. Поэтому и возникает вопрос о том, что происходит, если вызвать метод clear .

Когда объект QStandardItem передаётся в QStandardItemModel , то права собственности на данные объекты передаются в модель. И при вызове метода clear модель автоматически удаляет эти объекты из памяти.

Реклама

Реклама