Artisan
Artisan
- 0
- 0

Программы → Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box)
с++, Installer, cqtdeployer, deployment, самодостаточные установщики, qml
Спустя почти полгода вышло крупное обновление утилиты развертывания CQtDeployer.
В этом обновлении много нововведений, но основной упор сделан на создание пакетов.

QML → QML - Урок 036. Работа с сигналами и слотами в QML
Эта статья является наиболее полным описанием сигналов и слотов в QML по сравнению со всеми предыдущими статьями на этом сайте.
В этой статье я попытаюсь объяснить следующее при работе с Qt/QML + Qt/C++:
- способы объявления сигналов и слотов, также называемые методами в классе C++, которые будут зарегистрированы в слое QML
- способы подключения к сигналам классов, объявленных в C++ как контекст
- работа с Q_PROPERTY, для которого также требуются сигналы и слоты
- способы соединения сигналов и слотов в QML
- и т.д.

QML → QML - Урок 034. Передача структур данных из C++ слоя приложения в QML слой
QML, Qt, Meta, Q_INVOKABLE
Один из несомненных плюсов QML в Qt состоит в том, что он позволяет достаточно резко отделять backend-логику от интерфейса приложения. То есть весь backend мы пишем на C++, а в QML лишь отображаем необходимый результат.
При этом мы также можем и внутреннюю логику написать чисто на QML, минимизировав наличие C++ кода, или наоборот прописать дизайн некоторых элементов в C++, воспользовавшись возможностями OpenGL . Несмотря на разграничение QML и C++ частей кода на backend и frontend приложения, мы не имеем каких-либо больших ограничений.
Но иногда возникает необходимость передать некоторую структуру данных, которая будет нести несколько полей с информацией, в QML часть кода. Например такую структуру.
struct Structure { int m_number; QString m_message; };
Просто так такую структуру не получиться передать в QML и первое, что приходит на ум, это сделать сигнал sendToQml , который будет высылать несколько аргументов. Каждый аргумент будет отвечать за определённое поле структуры.
void sendToQml(int number, QString message);
Этот сигнал будет располагаться в вашем классе, который будет отправлять в QML определённую информацию с номерами, сообщениями и т.д. Минус подобного подхода очевиден, поскольку таких полей может быть очень много и будет глупо делать сигнал с парой десятков аргументов. Подобный подход будет полезен для пересылки небольшой информации, но никак не для структур данных.

QML → QML - Урок 033. Подключение JavaScript файлов в других JavaScript файлах в Qt/QML проекте
В рамках проекта на QML имеется возможность не только подключать JavaScript файлы в QML файлах, но и в других JavaScript файлах. При этом синтаксис подключения этих файлов будет аналогичен тому, что используется в QML файлах.
Например, вариант подключения JavaScript файла в QML файле
import "first.js" as FirstJs
Тогда, как подключение JavaScript файла в другом JavaScript файле будет отличаться лишь наличием точки перед этой строкой
.import "first.js" as FirstJs

QML → QML - Урок 023. Охота за багами при передаче указателя на QObject в QML
bug, Qt, pointer, JavaScriptOwnership, QML, указатель
Одними из самых мерзких и мало предсказуемых багов являются те, которые возникают в неопределённый момент времени. К числу таких можно отнести баг, который проявляется при передаче указателя на QObject в QML слой. Проблема заключается в том, что если у QObject отсутствует родитель, то при передаче в слой QML происходит смена владельца объекта, то есть ему устанавливается JavaScriptOwnership. В итоге, когда в QML слое пропадут все ссылки на данный объект, то он будет удалён сборщиком мусора QML. Соответственно, все ссылки в C++ слое окажутся невалидными. А приложение при попытке обращения по этим ссылкам молча схлопнется, ничего не сообщив о причине краха.
Говоря о неопределённости срабатывания бага, необходимо отметить, что эта неопределённость произрастает из момента сборки мусора. В обычном варианте этот момент может наступить тогда, когда программа откушает пару гигабайт памяти или когда памяти будет не хватать и её можно будет получить, произведя сборку мусора. То есть приложение может без проблем работать достаточно долго без проявления бага, и даже возможно пережить несколько версий, прежде чем баг проявится у какого-нибудь пользователя, который решит сообщить об этом разработчикам.
Стоит отметить, что данное правило не будет применяться к объектам объявленным в качестве Q_PROPERTY.
Но для демонстрации проблемы можно воспользоваться QML функцией gc() , которая ускорит сборку мусора.

QML → QML - Урок 004. Сигналы и слоты в Qt QML
qml, qt, connections, signal qml, qml урок, qt урок, сигналы и слоты qml, slot qml, example, qt qml
А вот мы и добрались до передачи данных между слоем QML и слоем C++. Честно говоря, принцип настолько же простой, как и просто использование сигналов и слотов в одном слое C++. Особенно в Qt 5.5.
Пример будет показан на основе программного кода из предыдущего урока , где мы создали диалоговое окно. Но скриншотов примера работы на Android не будет показано, но заверяю Вас - Всё работает как швейцарские часы.
Структура проекта с QML
структура проекта с qml По сравнению с предыдущим уроком, у нас появились некоторые изменения. А именно, добавился новый класс, который будет являться ядром приложения.
- appcore.h - заголовочный файл ядра приложения;
- appcore.cpp - файл исходных кодов ядра приложения.
А продолжать работать мы также будем с QQMLApplicationEngine. Нужно будет просто взять от движка QML контекст и загрузить в него объект нового класса, от которого будут поступать сигналы и в который будут передаваться данные.

Qt → Qt/C++ - Урок 026. Применение CallBack функции
callback функция, callback, Qt урок, callback c++, Qt callback
Для передачи данных в Qt используется система сигналов и слотов, но это не означает, что нельзя применить старый проверенный способ, а именно использование CallBack функций. Дело в том, что использование CallBack функции является несколько более быстродействующим вариантом, чем сигналы и слоты. А также может быть более легким в применении, что касается того, что сигналы желательно отсоединять от слотов, когда объект посылающий сигнал уничтожается в программе и больше не используется. Этот момент особенно актуален, если учитывать то, что в C++ отсутствует сборщик мусора, как в Java или C# .
Принцип работы CallBack функции
Принцип работы CallBack функции Для использования CallBack функций в классе, который должен будет возвращать результат, необходимо объявить указатель на функцию с такой же сигнатурой, как и у функции, которая будет использована в качестве CallBack функции. А для установки указателя на функцию необходимо использовать метод класса для установки этого указателя. То есть в этот метод передаётся указатель на функцию, который устанавливается в CallBack указатель класса, который будет возвращать результат своей деятельности. При этом в данном классе этот указатель используется как обычная функция, которая будет совершать заданные действия в классе, из которого эта функция была установлена в качестве CallBack функции в текущем классе.
Для примера будет использован класс, который отрисовывает квадрат на графической сцене и управляется клавишами W, A, S, D. При движении квадрат должен отсылать данные о своих координатах в класс, в котором был создан. То есть должен вызывать функцию данного класса в качестве своей CallBack функции.

Qt → Qt/C++ - Урок 024. Сигналы и слоты в Qt5
сигналы слоты Qt, сигналы Qt, слоты Qt, Qt5, слот, пример, сигнал, сигналы слоты Qt5, example
Сигналы и слоты используются для коммуникации между объектами в Qt. Механизм сигналов и слотов является центральной функцией в Qt, и вероятно это то, что отличает Qt по своему функционалу от других фреймворков. Сигналы и слоты стали возможны благодаря мета-объектной системе Qt.
Введение
При программировании GUI, когда изменяется один из виджетов, мы зачастую хотим, чтобы другие виджеты были об этом уведомлены. В общем случае, мы хотим, чтобы объекты могли взаимодействовать друг с другом. Например, если пользователь нажал кнопку Закрыть , мы вероятно захотим, чтобы объект window вызвал функцию close().
Другие инструменты разработки обеспечивают подобный функционал использованием callback. callback являет указателем на функцию, и если Вы хотите выполнить функцию, которая уведомит Вас о каком-либо событии, то Вы передаёте указатель на другую функцию, то есть callback. Работающая функция вызывает callback тогда, когда это уместно. В то время как существуют фреймворки, которые успешно используют callback функции, тем не менее callback являются неинтуитивным способом, который может вызывать проблемы с обеспечением корректности возвращаемых аргументов.

Timeweb
Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.
В течение многих лет Timeweb доказывает свою стабильность.
Для проектов на Django рекомендую VDS хостинг
Посмотреть Хостинг