Реклама

Поиск

Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt

TutorialQtWinAPI, Qt, ICMP, PING299

Сходу хочу расстроить Вас, Дорогой Читатель. Qt не обладает функционалом для работы с протоколом ICMP и соответственно придется использовать для этих целей API целевой операционной системы. Впрочем, это не удивительно. Протокол ICMP является низкоуровневым протоколом, и для работы с ним требуется использование сырых сокетов, которые не реализованы в Qt .

Но это не является особой проблемой, поскольку в основных целевых платформах имеется необходимый API для реализации ping посылок. Например Microsoft предоставляет простое использование ICMP протокола на основе функции IcmpSendEcho.

Описание IcmpSendEcho

Функция IcmpSendEcho отсылает эхо запросы IPv4 ICMP и возвращает ответы на эхо запросы. Вызов возвращается когда выходит время ожидания или заполняется буфер ответа.

DWORD IcmpSendEcho(
  _In_     HANDLE                 IcmpHandle,
  _In_     IPAddr                 DestinationAddress,
  _In_     LPVOID                 RequestData,
  _In_     WORD                   RequestSize,
  _In_opt_ PIP_OPTION_INFORMATION RequestOptions,
  _Out_    LPVOID                 ReplyBuffer,
  _In_     DWORD                  ReplySize,
  _In_     DWORD                  Timeout
);

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

TutorialQtAIMP, QSS, Qt, QStyleSheet, аудио, аудио плеер, кастомизация148

Статьи данного цикла:

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

А как насчёт того, чтобы кастомизировать внешний вид плеера так, чтобы он походил, например, на AIMP? Сразу для сравнения посмотрим на оригинальный AIMP и внешний вид плеера после кастомизации.

Реклама

Qt/C++ - Урок 026. Применение CallBack функции

TutorialQtcallback c++, callback, callback функция, Qt callback, Qt урок288

Для передачи данных в Qt используется система сигналов и слотов, но это не означает, что нельзя применить старый проверенный способ, а именно использование CallBack функций. Дело в том, что использование CallBack функции является несколько более быстродействующим вариантом, чем сигналы и слоты. А также может быть более легким в применении, что касается того, что сигналы желательно отсоединять от слотов, когда объект посылающий сигнал уничтожается в программе и больше не используется. Этот момент особенно актуален, если учитывать то, что в C++ отсутствует сборщик мусора, как в Java или C# .

Принцип работы CallBack функции

Принцип работы CallBack функции

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

Для примера будет использован класс, который отрисовывает квадрат на графической сцене и управляется клавишами W, A, S, D. При движении квадрат должен отсылать данные о своих координатах в класс, в котором был создан. То есть должен вызывать функцию данного класса в качестве своей CallBack функции.

Как написать игру на Qt - Урок 5. Добавляем звук с QMediaPlayer

TutorialQtGameDev, QMediaPlayer, QMediaPlaylist, Qt звук, Qt, написать игру160

Приступаем к пятому и заключительному уроку по написанию игры на Qt, в котором добавим звук с помощью класса QMediaPlayer. Предлагаю добавить три вида звуков: Поедание яблок, жужжание Мухи, которая будет жужжать при передвижении и душераздирающий вопль, когда Муху съедят.

Звук в структуре проекта

Звук в структуре проекта помещается в файл ресурсов, как показано на скриншоте структуры проекта.

Для этого создаём папку resource и в ней папку game. Далее в папке resources создаём файл ресурсов, в котором прописываем префикс "/" и добавляем аудио файлы, которые предварительно поместили в папку game.

А далее звуки необходимо подключить к проекту с использованием класса QMediaPlayer.

В данном случае звуки подключаются в трёх местах программного кода.

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

TutorialQtHook, mouse, Qt, SetWindowsHookEx, WinAPI169

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

SetWindowsHookEx

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

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);

Реклама

Qt WinAPI - Урок 002. Как сделать win инсталлятор для Qt-приложения?

TutorialQtWinAPI, DLL, InnoSetup, Windows, Qt, Инсталлятор242

В прошлой статье Мы научились быстро собирать все используемые в проекте DLL-библиотеки. А теперь настало время поговорить о том, как собрать инсталлятор для ОС Windows. Уже длительное время пользуюсь довольно удобной opensource утилитой под названием InnoSetup, которая позволяет буквально в несколько кликов собирать мультиязычный инсталлятор.

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

Сборка инсталлятора

Шаг первый. Запуск сценария сборки скрипта

Для запуска сценария заходим в меню и выбираем создать новый: File > New или комбинация клавиш Ctrl + N.

После чего нажимаем на кнопку Next.

Как написать игру на Qt - Урок 1. Управление объектом

TutorialQtGameDev, getasynckeystate, QGraphicsItem, QGraphicsScene, Qt, WinAPI, написать игру480

С этого урока начинается серия статей о том, как написать игру на Qt. В предыдущей статье было рассказано о системе позиционирования графических элементов QGraphicsItem в графической сцене QGraphicsScene. Был нарисован треугольник и помещён в центр графической сцены, размеры которой были 500 на 500 пикселей. А теперь настало время этот треугольник оживить, а вернее начать им управлять.

Составим техническое задание урока:

  • В окне располагается графическая сцена с размерами 500 на 500 пикселей (это уже сделано в предыдущем уроке);
  • В центре графической сцены находится красный треугольник (что также уже сделано в прошлом уроке);
  • Треугольник должен перемещаться при нажатии клавиш со стрелками Up, Down, Left, Right;
  • Треугольник не должен выходит за пределы графической сцены, то есть должен быть ограничен размерами графической сцены.

Примечание. В данном проекте используется WinAPI, поэтому проект применим для использования в операционной системе Windows, а для Linux и MacOS применим лишь алгоритм, который используется в данном уроке. Поэтому если Вы желаете написать игру под эти ОС, то необходимо будет использовать библиотеки этих ОС для асинхронной обработки нажатия клавиш.

Qt WinAPI - Урок 003. Использование windeployqt для сбора DLL

TutorialQtWinAPI, DLL, Qt, windeployqt, windows200

В одном из уроков по Qt уже было показано, как собрать все DLL , применяемые в проекте для подготовки программы к использованию на других ПК, работающих под управлением ОС Windows , а теперь предлагаю ознакомиться с утилитой, которая поставляется вместе с Qt . Данная утилита называется windeployqt и является консольным приложением, которое, как правило, идёт в поставке с компиляторами MinGW или MSVC.

Для использования windeployqt необходимо запустить из консоли, передав в качестве аргумента путь к скомпилированному исполняемому файлу приложения. После чего windeployqt соберёт все необходимые библиотеки в папке, где располагается исполняемый файл.

Утилита windeployqt располагается в папке bin , которая в свою очередь располагается в папке компилятора для Qt. Таким образом, путь к папке может быть следующим:

  • для MinGW - C:\QT\5.5\mingw492_32\bin\windeployqt.exe
  • для MSVC - C:\QT\5.5\msvc2013\bin\windeployqt.exe

Как написать игру на Qt - Урок 2. Анимация героя игры (2D)

TutorialQtGameDev, QPainter, Qt, анимация, написать игру298

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

В данном уроке корректировка программного кода производилась в главным образом в файлах triangle.h, triangle.cpp и самую малость в файле widget.cpp.

Анимация Мухи по шагам

Опишем  алгоритм, по которому будет производиться отрисовка Мухи:

  1. Инициализируем в конструкторе класса переменную, которая будет отвечать за номер положения ножек. Всего будет три положения ножек мухи.
  2. Инициализируем в конструкторе класса переменную, которая будет считать полезные тики игрового таймера, то те тики, во время которых Муха передвигалась. Это необходимо, чтобы отсеять те тики, в которых не было движения Мухи, иначе Муха будет постоянно перебирать ножками, даже если мы не будем управлять Мухой.
  3. Отрисовываем Муху в методе paint, выбирая, какое из положений ножек мухи будет отрисовываться.
  4. В слоте, который обрабатывает событие отсчета игрового таймера производит накопление и обнуление счетчика полезных тиков игрового таймера и в зависимости от его величины устанавлвиваем положение ножек Мухи, а именно полностью перерисовываем Муху с нужным положением ножек.

Qt Linux - Урок 002. Глобальный HotKey в Linux в приложении на Qt 5

TutorialQtUbuntu, HotKey, linux, Qt, XCB, XLib129

Работа с глобальными хоткеями в Windows является более тривиальной задачей, чем в Linux, поскольку в WinAPI имеются для этого подготовленные методы, которые не требуют большого количества кода. А также каждому хоткею устанавливается в соответствие ID , по которому данный хоткей можно удалить.

В Linux/Unix , которые используют графический сервер X11, применительно к Qt необходимо использовать функции для регистрации/разрегистрации хоткеев из библиотеки XLib, но обрабатывать приходится получаемые значения с помощью функционала библиотеки XCB, которая разрабатывается как аналог библиотеки XLib , но является более низкоуровневой и написана на языке программирования Си. Как и в случае с Windows, для обработки глобальных хоткеев в Qt 5.5 используется метод nativeEventFilter. Предлагаю сделать отдельный класс, наследованный от QAbstractNativeEventFilter для обработки хоткеев и установить данный фильтр на всё приложение.

Для установки хоткеев будут использоваться функции XKeysymToKeycode (для получения кода клавиши из последовательности KeySym) и XGrabKey (для установки хоткея).

Для разрегистрации хоткея будет использоваться функция XUngrabKey .

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

  • GlobalHotkeyLinux.pro - профайл проекта;
  • mainwindow.h - заголовочный файл главного окна приложения;
  • mainwindow.cpp - файл исходных кодов главного окна приложения;
  • mainwindow.ui - файл формы главного окна приложения;
  • main.cpp - основной файл исходных кодов;
  • nativeeventfilter.h - заголовочный файл фильтра событий хоткеев;
  • nativeeventfilter.cpp - файл исходных кодов фильтра событий хоткеев.

Реклама

Реклама