Реклама
13 июня 2016 г. 23:35

Qt WinAPI - Урок 009. SetWindowsHookEx - Логирование событий мыши через WinAPI

РуководствоQtHook, mouse, Qt, SetWindowsHookEx, WinAPI1299

Функционал WinAPI позволяет на низком уровне с помощью хуков отслеживать события системы, такие как движение и клики мыши. Данный функционал работает на основе функций callback, поэтому если хочется использовать ООП и систему сигналов и слотов , то нужно будет один из методов передавать в качестве функции callback в функцию по регистрации callback в системе Windows. Но метод должен быть статическим, поэтому требуется разрабатывать класс в качестве Синглтона.

SetWindowsHookEx

Данная функция используется для регистрации функции-обработчика событий в цепочке hook-обработчиков для отслеживания некоторых событий в системе Windows

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);
5 июня 2016 г. 22:43

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

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

После того, как мы ознакомились с переводами интерфейса приложения на 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 слоя.
5 июня 2016 г. 18:28

Qt/C++ - Урок 050. Логирование событий Qt приложения в текстовый файл

РуководствоQtfile, log, Logger, qDebug, qFatal, qInfo, qWarning, Логирование4599

Все Qt-разработчики используют qDebug(), когда отлаживают приложение, написанное на Qt, но также имеются макросы qInfo(), qWarning(), qCritical() и qFatal() (который на момент написания статьи был с ошибками и не работал).

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

Для перенаправления сообщений об ошибках в текстовый файл, вам необходимо установить CallBack-функцию обработчик в приложение. Для этого используется функция qInstalMessageHandler .

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

void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);

Через эту функцию мы будем получать следующие данные:

  1. QtMsgType type - Тип сообщения
    1. QtInfoMsg
    2. QtDebugMsg
    3. QtWarningMsg
    4. QtCriticalMsg
    5. QtFatalMsg
  2. QMessageLogContext &context - контекст сообщения, самое полезное в котором - это категория сообщения. Это может быть полезным, когда необходимо определить местоположение сообщения в коде, то есть из каких компонентов мы получаем данные или к какому типу взаимодействия относится сообщение.
  3. QString &msg - передаваемое сообщение об ошибке.
30 мая 2016 г. 18:13

Qt/C++ - Урок 049. QTranslator - динамический перевод мультиязычного приложения на Qt

РуководствоQtQt, Linguist, QTranslator2503

Рано или поздно разработчик приложений на Qt встречается с необходимостью поддержки мультиязычности в своём приложении. Вот тогда на помощь и приходит класс QTranslator и специализированное приложение для создания переводов Qt Linguist .

Объект класса QTranslator используется для загрузки переводов из специального файла с расширением .qm, который является шестнадцатеричным файлом переводов. Данный файл компилируется из файла переводов в XML формате, который имеет расширение ts и прописывается в pro файле проекта. Данный файл содержит все строки приложения, которые были заключены в функцию tr(). Рекомендую задавать весь интерфейс приложения на английском языке, который будет языком по умолчанию, а переводы уже с нужным языком подгружать из файлов переводов. Если нужный файл перевода не будет найден, то автоматически будет загружен перевод на английском языке. Хотя Вы, конечно, можете применить и другой язык в качестве языка по умолчанию.

15 мая 2016 г. 17:11

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

РуководствоQtmoveToThread, QObject, Qt, QThread, потоки3149

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

Теперь же мы создадим класс ExampleObject, объекты которого будут передаваться в отдельные потоки с помощью метода moveToThread() и выполняться в этих самых потоках. А полезную работу будет совершать слот-метод run(), который будет определён в данном классе. Что важно, класс объектов будет наследован от QObject .

Для того, чтобы работа в методе run() могла выполняться циклично, используем цикл while , управлять которым будем с помощью переменной bool m_running. Для удобства работы с этой переменной определяем её в качестве Q_PROPERTY. Ну а по завершении работы будем испускать сигнал finished() .

15 мая 2016 г. 14:30

Ruby on Rails - Генерирование ресурсов

РуководствоRubyRuby, Ruby on Rails, user, web, генерирование581

После того, как удалось получить в предыдущей статье рабочий вариант веб-приложения на Ruby, пошёл разбираться дальше с разработкой и генерированием ресурсов, а также с изучением архитектуры веб-приложений Ruby on Rails. Благо данный фреймворк использует паттерн MVC, который также используется в  Qt, поэтому в целом с пониманием архитектуры проблем возникнуть не должно.

В процессе поиска источников информации в стиле "Ruby для чайников", "Ruby за 21 день" и т.д. я натолкнулся, по-видимому, на весьма замечательный ресурс , который является переводом книги Ruby on Rails Tutorial by Michael Hartl. Первое впечатление от книги оказалось положительным. Так что дальнейшее самообучение, пожалуй, буду проводить по этому ресурсу.

Из первых плюсов, которые обнаружил, так это упоминание среды разработки RubyMine от JetBrains. Я уже знаком с такими продуктами, как WebStorm, PHPStorm, Intellij IDEA и основанной на ней AndroidStudio, поэтому на данный момент остановил свой выбор на этой среде разработки. Что странно Google по запросам Ruby IDE и аналогичным, не показал информации об этой среде разработки, видимо ещё не раскрутились.

В общем полон мир открытий чудных для новичка. Ну а теперь приступим непосредственно к генерированию ресурсов, которые будут работать на основе MVC паттерна.

15 мая 2016 г. 14:16

Ruby on Rails - Первый старт под Windows

РуководствоRubyRails, Ruby, Ruby on Rails, web, Wordpress1459

Работая с Wordpress на хостинг-провайдере TimeWeb уже почти год, начинаю проявлять всё больший интерес к веб-разработке. В частности это также связано с тем, что данная CMS всё же достаточно прожорлива до ресурсов, а также и с тем, что начинают появляться мысли по поводу новых проектов. Да и в плане расширения кругозора в области программирования хотелось бы попробовать чего-нибудь иного, отличного от Qt/C++ .

Поэтому выбор пал на Ruby on Rails . Здесь я получаю и нечто иное, отличное от Qt/C++ , а также и возможность поработать в области веб-разработки в своё удовольствие.

Полистав немного документацию и примеры первого запуска веб-сервиса в стиле "Hello world!" , я решил поделиться тем, что из этого вышло.

9 мая 2016 г. 23:12

Qt/C++ - Урок 047. QThread - создание потоков в Qt

РуководствоQtQt, QThread, потоки2181

Одним из распространённых способов создания отдельных параллельных потоков в приложении на Qt и выполнения полезных действий в них является наследование от класса QThread и переопределение метода run() , в котором и будет выполняться полезный код приложения. При знакомстве с потоками довелось прочитать различные мнения на эту тему, и в данном уроке познакомимся с одним из возможных способов работы с потоками, но который считается не самым лучшим вариантом.

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

Данный метод является самым низкоуровневым и используется в первую очередь для кастомизации нативных потоков. Что несколько противоречит обычной необходимости выполнения задачи в отдельном потоке. То есть, как было сказано выше, подобный подход в первую очередь необходим для того, чтобы расширить функционал класса. Но тем не менее, данный метод необходимо рассмотреть, к чему и приступим.

16 апреля 2016 г. 22:23

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

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

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

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

12 апреля 2016 г. 17:26

Управление PTZ-камерой. Протокол Pelco-P

РуководствоC++Pelco, Pelco-P, PTZ, протокол1531

В предыдущей статье был рассмотрен вариант работы с протоколом Pelco-D, а теперь рассмотрим работу с протоколом Pelco-P - это доработанная вариация предыдущего протокола управления PTZ-камерами, который также разработан одноимённой компанией Pelco. Также используется поверх интерфейса RS482/485 для связи с видеокамерами, оборудованными сервоприводами.

Протокол Pelco-P также имеет набор стандартных команд управления, а также расширенный комплект команд. Рассмотрим, как можем работать со стандартными командами. Протокол Pelco-P разберём на примере абстрактного источника команд и абстрактного SDK, которое принимает сообщение для дальнейшей передачи его в интерфейс RS485.

Таким образом имеется протокол, через который передаются данные, данные разбираются и дальше передаются в SDK, который уже отсылает сообщение в тракт передачи RS485. Ниже представлен рисунок, на котором имеется жёлтый квадрат. Именно в этой функции и будет формироваться необходимое нам сообщение, которое нужно будет передать в SDK.

Реклама
Последние пройденные тестирования
  • namat
  • 22 июня 2017 г. 5:27

C++ - Тест 002. Константы

Результат - 91 баллов

  • namat
  • 22 июня 2017 г. 5:22

C++ - Тест 001. Первая программа и типы данных

Результат - 100 баллов

C++ - Тест 001. Первая программа и типы данных

Результат - 80 баллов

Последние комментарии
  • EVILEG
  • 16 июня 2017 г. 12:15

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Не, не совсем так. Здесь нужно будет учитывать сдвиг позиции курсора относительно координаты (0, 0) в координатной системе MoveItem. Получается тогда так: Координаты сдвиг...

  • damix
  • 15 июня 2017 г. 21:39

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Лучше где-то в классе MoveItem объявить QPointF mouseCoords; А потом void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ mouseCoords = event->pos();}void...

  • EVILEG
  • 15 июня 2017 г. 13:27

QML - Урок 007. ListView Qml. Динамическое создание и удаление элементов

Не хотелось бы повторяться. В статье по сигналам и слотам в QML есть вариант использования C++ объекта. Там используется тип Connections , который можно настроить на сигн...

Сейчас обсуждают на форуме

QEvent. Переопределение метода event().

EVILEG, благодарю, что все разъяснили. ;)

  • EVILEG
  • 17 июня 2017 г. 13:13

QWizard

Думаю, что это возможно. У QWizard есть метод setButtonLayout , который устанавливает, какие именно кнопки могут быть видны на страницах. Так вот, у QWizardPa...

  • DrGen
  • 15 июня 2017 г. 17:10

Ключи QMultiMap в роли кнопок

Большое спасибо! даже не думал, что вопрос окажется интересным.

Вопрос по QTableWidget ?

Спасибо )