Реклама
3 апреля 2017 г. 0:22

PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты)

РуководствоPyQt5PyQt5, QML, QtQuick, Signal, Slot1124

А теперь более глубоко погрузимся в работу с Qt с помощью PyQt5, воспользовавшись современными возможностями Qt. Под такими возможностями я подразумеваю QtQuick и QML. PyQt5 позволяет использовать классы Qt, которые могут обрабатывать QML код, а следовательно, можно написать интерфейс на QML, а также передавать сигналы в QML слой и вызывать слоты объектов, наследованных от QObject из QML слоя.

Чтобы познакомиться с такими возможностями PyQt5, напишем программу, которая реализует следующие задачи:

  • Интерфейс программы должен быть написан на QML
  • Должен быть реализован класс, наследованный от QObject и написанный на python, с которым будем взаимодействовать из QML
  • Приложение с помощью данного класса должно будет складывать и вычитать целые числа

Внешний вид приложения должен выглядеть следующим образом:

3 февраля 2017 г. 22:55

QML - Урок 027. Добавляем QML в проект на QWidget

РуководствоQMLQQuickWidget, QML, C++, QWidget1784

При разработке приложения на Qt может случиться такая ситуация, когда потребуется в приложение, написанное на QWidgets внедрить функционал, написанный на QML. Для решения подобной задачи может использоваться класс QQuickWidget , который служит для рендеринга QML.

Напишем простейший hello world, который позволит отрисовать код, написанный на QML в виджете, который помещён в окно, основанное на QWidget. Чтобы оно выглядело следующим образом:

25 января 2017 г. 21:07

Qt 5.8 released

НовостиQtQt Lite, Qt 5.8, QML, Charts, Wayland, CAN, Modbus, Quick1796

23-го января Qt Company анонсировала выпуск Qt 5.8, с рядом нововведений, которые носят достаточно глобальный характер. Давайте ознакомимся с ними.

Qt Lite

Одной из главных тематик Qt 5.8 стало сделать так, чтобы Qt был более гибким и лёгким к адаптации к целям пользователей, в частности для разработчиков встраиваемых систем. Qt Lite является кодовым именем проекта, целью которого является внедрение данных целей.

Целью разработчиков Qt Company стало сделать Qt проще в настройке под нужды разработчиков с избеганием использования функционала, который не требуется в проекте. Это приносит значительную экономию в размере скомпилированных библиотек Qt и разрабатываемого приложения.

Внедряемая система является длинным путешествием, где была переписана значительная часть системы, которая отвечает за конфигурирование Qt. Эта новая система очищена от того, что наросло за последние 15 лет, и это также может привести к несоответствиям с тем, как Qt был сконфигурирован на различных платформах.

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

14 июля 2016 г. 15:57

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

РуководствоQMLJavaScript, QML, Qt, динамические объекты, игровая арена1422

После первого опыта по написанию игры на 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 логикой игры.

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

14 июля 2016 г. 15:00

Игра на QML - Урок 2. Добавляем следы от выстрелов и систему очков

РуководствоQMLGameDev, QML, Qt, система очков1059

После того, как была сделана игровая арена и добавлены мишени, настало время реализовать попадание по мишеням, промахи и систему начисления и списывания очков.

Система начисления и списывания очков будет следующая:

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

Счёт будет отображаться в верхней части игрового поля.

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

Для реализации данной задумки понадобится, кроме модификации части файлов, добавить следующие файлы:

  • InfoBar.qml - который будет отображать информацию о счёте;
  • Bullet.qml - файл с описанием типа пулевого отверстия;
  • bullet-1.png, bullet-2.png, bullet-3.png, bullet-4.png, bullet-5.png, bullet-6.png - файлы с изображениями пулевых отверстий;

Возможные варианты пулевых отверстий размещаются в папке graphics, туда же было перенесено изображение мишени.

30 июня 2016 г. 22:53

QML - Урок 026. Intents с Qt для Android, часть 1

РуководствоQMLAndroid, Qt, QML, Intent1357

"Intent" является главной возможностью для межпроцессорного взаимодействия в Android. В основном, Intent является объектом, который обрабатывается операционной системой и передаётся затем одному или большему количеству установленных приложений, основываясь на его содержании. Это может быть экземпляр запроса отображения видео, в данном случае тип intent должен быть ACTION_VIEW и mime тип должен быть установлен соответствующий. Приложения могут подписываться на соответствующие Intents в настройках фильтра intent в своих манифест файлах. В первый раз пользователю устройства будет предоставлен выбор, какие типы intent известны приложению и на какие можно подписаться. Если они выбраны, они будут установлены по умолчанию, или выбраны при вопросе от каждого экземпляра приложения при необходимости.

Это первая из нескольких статей, как использовать intents с Qt для Android.

Сам механизм имеет довольно общий характер. То, что описано выше является одним из способов использования, но intents также могут быть использованы и для другого: Одним из таких случаев является запуск сервисов внутри приложения. Это, как правило, называется "explicit intent", что означает, что предусмотрено для запуска полное имя сервиса, и не может быть перехвачено другим приложением.

Другим способом использования intents является широковещательный вариант (broadcast), для экземпляров, когда изменяется временная зона устройства. В это время как действия описанные выше позволяют запускать только одно определённое приложение, выбранное пользователем, то при широковещательном вариант сигнал будет передан во все приложения, которые были на него подписаны.

28 июня 2016 г. 13:34

Qt Сертификация

НовостиQtQt, QML, Certification, Сертификация705

Ещё с 2009 года было возможно сдать экзамен на Qt сертификацию и стать Сертифицированным Qt разработчиком или Qt специалистом. Сейчас экзамены и сертификации обновлены, чтобы охватить последние функции Qt. Для того, чтобы поддержать качественное обучение и подготовку Qt разработчиков к экзаменам, Qt Company также запускает партнёрскую программу обучения.

5 июня 2016 г. 22:43

QML - Урок 025. Динамический перевод мультиязычного приложения на QML

РуководствоQMLQt, QML, перевод, QTranslator, translation1050

После того, как мы ознакомились с переводами интерфейса приложения на Qt/C++ , настало время изучить возможности динамического перевода приложения, интерфейс которого написан на QML.

При разработке на QML есть пара моментов, которые нужно учесть, в отличие от стандартного приложения на QWidgets, а именно:

  1. Требуется дополнительная настройка .pro файла проекта;
  2. Сам процесс загрузки переводов для нужного языка осуществляется в C++ слое;
  3. Переинициализация перевода интерфейса осуществляется в QML слое с помощью функции qsTr();
  4. После загрузки перевода, нужно отправить сигнал из C++ слоя в QML слой, чтобы заново перевести интерфейс приложения, что аналогично и для С++ приложения, но требует настройки взаимодействия С++ слоя с QML слоем.

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

Создаём проект, в который будут входит следующие файлы:

  • QmlLanguage.pro - профайл проекта;
  • deployment.pri - файл настройки деплоя, создаётся по умолчанию;
  • main.cpp - файл исходных кодов с функцией main;
  • qmltranslator.h - заголовочный файл класса загрузки перевода;
  • qmltranslator.cpp - файл исходных кодов класса загрузки перевода;
  • main.qml - основной файл QML слоя.
16 апреля 2016 г. 22:23

QML - Урок 024. Custom QQuickItem - добавляем в QML объект из C++

РуководствоQMLCustom QQuickItem, QQuickItem, QQuickPaintedItem, Qt, QML1437

QML объекты в Qt весьма замечательны, с ними удобно работать, но что если стандартных объектов нам становится недостаточно? Тогда можно сделать собственный объект, запрограммировать его в C++ и внедрить в логику QML слоя. В данном уроке предлагаю сделать небольшой импровизированный таймер, который можно запустить, остановить и очистить, но при этом дизайн таймера будет разработан в C++ слое и по сути большая часть работы будет осуществляться в C++.

А для разработки кастомизированного QuickItem понадобится использовать QQuickPaintedItem, в котором будет таймер, представленный на рисунке ниже, который будет нарисован наподобие обычного QGraphicsItem , но он будет обладать рядом свойств, которыми можно будет управлять из QML слоя.

2 февраля 2016 г. 22:10

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

РуководствоQMLQt, QML, указатель, JavaScriptOwnership, pointer, bug681

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

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

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

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

Реклама
Последние комментарии
  • EVILEG
  • 23 мая 2017 г. 12:26

Qt/C++ - Урок 005. QSqlRelationalTableModel - Работаем со связными таблицами

В классе DataBase указывается путь к базе данных. В данном случае C:/example/ и т.д. Так вот, у вас есть каталог example ?

  • EVILEG
  • 23 мая 2017 г. 12:19

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

Нет. не верно. Ошибка вот в этой строке: QPixmap inixmap = fileName; // Сохраняем его в изображение объекта QPixmap; Выше я показывал, как что нужно путь передавать в качестве аргумент...

Qt/C++ - Урок 029. Изображение в базе данных в Qt – Сохранение и Восстановление

QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "/home", tr("Images (*.png *.xpm *.jpg)")); QPixmap inixmap = fileName; // Сохраняем его в и...

Qt/C++ - Урок 005. QSqlRelationalTableModel - Работаем со связными таблицами

https://www.dropbox.com/sh/vhxcx0iyq0j4578/AACwgWPnZwNqGBndKESiXfFqa?dl=0

  • tetta
  • 22 мая 2017 г. 1:32

Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP

Как сделать так, что бы только когда верхнюю полосу зажимаешь, то перетаскивалось окно и что бы оно оставалось на месте?

Сейчас обсуждают на форуме
  • tetta
  • 23 мая 2017 г. 17:59

Создание кнопки "new", "save" и "open". MDI. toolBar

void MainWindow::open(){ QString openFile = QFileDialog::getOpenFileName(this, tr("Open File"), "C:/", ...

Проверка наличия записи в БД при выполнении запроса

Код форм про которые говорил прикрепил. regrdit форма в которой отображается информация отбираемая из базы. editobject форма для редактирования

  • Arrow
  • 23 мая 2017 г. 13:41

qmake

Странно по сообщениям выдает, что у меня компилирутся 32 bit версия (x86 build). Компилятор опознан правильно и в ABI сам определилил x86-windows-msys-pre-64bit и исполняемый файл создае...

WinApi CBTProc

Да всех активных, тоесть через CBT.