Реклама
8 января 2016 г. 22:53

Qt WinAPI - Урок 006. Разбор QKeySequence для RegisterHotKey в WinAPI

РуководствоQtHotKey, QKeySequence, Qt, RegisterHotKey, WinAPI, горячие клавиши1268

QKeySequence сильно отличается от последовательности горячих клавиш в WinAPI. QKeySequence фактически является строкой, в которой разделителем горячих клавиш являются знак "+" , а также последовательность ", " в случае, если последовательностей несколько. Тогда, как в WinAPI имеются модификаторы Alt, Ctrl, Shift, которые представлены беззнаковым целочисленным типом, и горячей клавишей, которая представлена кодом клавиатуры.

Разберём вариант, когда имеется одна последовательность в QKeySequence и её необходимо зарегистрировать в качестве глобальной горячей клавиши в WinAPI. Для этого условимся, что QKeySequence в качестве в качестве модификатора будет иметь лишь клавиши Ctrl, Alt, Shift и в качестве горячей клавиши одну из букв английского алфавита.

Далее для разбора QKeySequence напишем две функции:

  • unsigned int winKeyMod(QKeySequence) - которая будет возвращать целочисленную комбинацию модификаторов;
  • char winHotKey(QKetSequence) - которая будет возвращать код горячей клавиши.

Модификаторы Alt, Ctrl и Shift в битовом варианте имеют значения 0b00000001, 0b00000010 и 0b00000100 соответственно, поэтому логическое ИЛИ либо сложение данных чисел даст необходимое число комбинации. Следовательно необходимо в методе winKeyMod, выделить модификаторы из последовательности и в случае их наличия прибавить к числу модификатора, которое вернёт данный метод.

4 января 2016 г. 21:41

QML - Урок 022. Анимация клика по элементу списка в стиле Material Design

РуководствоQMLанимация, material design, Android, Qt, QML1699

QML не предоставляет анимацию взаимодействий кликов в стиле Material Design для Android по умолчанию, но это легко настраивается с помощью примитивов Rectangle. Анимация заключается в том, чтобы в одном родительском объекте Rectangle, при клике, необходимо второй дочерний объект Rectangle растянуть на всю область родительского. При этом дочерний объект будет растягиваться в течении определённого времени и выглядеть будет как расширяющийся круг, но при этом он не будет выходить за пределы родительского объекта.

Для наглядности создадим список элементов, по которым будем производить клики. Для отслеживания кликов будет использоваться область MouseArea, в которой будет отслеживаться несколько сигналов взаимодействия:

  • onClicked - в данном сигнале будет останавливаться анимация и выполняться результат взаимодействия со списком;
  • onPressed - при сигнале нажатия необходимо запустить анимацию, с предварительной установкой координат анимируемого объекта Rectangle.
  • onReleased - при отпускании элемента списка необходимо остановить анимацию;
  • onPositionChanged - при смене позиции области также необходимо остановить анимацию.

Для выполнения анимации используется объект PropertyAnimation. В данном объекте выбирается цель анимации, и список свойств, которые будут подвергаться изменению. В случае с анимируемым объектом Rectangl, необходимо расширять его как круг, для этого увеличиваем его свойства width, height и radius с одной и той же величиной. А для того, чтобы полностью заполнить родительский объект, выставим конечную величину свойств в три раза большую, чем ширина родительского элемента.

Также важным свойством родительского элемента является:

clip - активируя данное свойство ( true ), Мы обрезаем дочерние элементы объекта, чтобы они не выходили за границы родительского элемента.

3 января 2016 г. 22:35

Qt WinAPI - Урок 005. Глобальный HotKey WinAPI в Qt 5

РуководствоQtQt, HotKey, RegisterHotKey, UnregisterHotKey, WinAPI, горячие клавиши2197

Для работы с глобальными HotKey в Qt 5 присутствует виртуальный метод nativeEvent . Данный метод заменил методы winEvent , x11Event , macEvent из Qt 4.8.

Фишка в работе HotKey с Qt заключается в том, что если окно находится не в фокусе, то есть оно, например, будет свёрнуто в системный трей, то тогда зарегистрированные QShortcut работать просто не будут. Поэтому необходимо работать с глобальными событиями от операционной системы, то есть перейти к реализации платформозависимой части кода в приложении на Qt.

RegisterHotKey

В данном примере разберём вариант работы с WinAPI . Для этого воспользуемся функцией RegisterHotKey.

BOOL WINAPI RegisterHotKey(
  _In_opt_ HWND hWnd,
  _In_     int  id,
  _In_     UINT fsModifiers,
  _In_     UINT vk
);
2 января 2016 г. 23:30

Qt WinAPI - Урок 008. Добавление Qt приложения в автозапуск Windows через QSettings

РуководствоQtQt, WinAPI, Windows, автозагрузка, автозапуск1744

Как известно, класс QSettings позволяет сохранять настройки приложения в реестре ОС Windows . Благодаря такой возможности и хорошему знанию работы реестра Windows можно добавить приложение в автозапуск, либо удалить его оттуда через, например, диалог настроек приложения. Для этого можно воспользоваться чекбоксом, и в случае, если он отмечен, то по клику по кнопке подтверждения в диалоговом окне записать приложение в автозапуск, в противном же случае удалить его из автозапуска.

В любом случае всё сводится к двум действиям.

Записываем приложение в автозапуск

#ifdef Q_OS_WIN32
    QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
    settings.setValue(APPLICATION_NAME, QDir::toNativeSeparators(QCoreApplication::applicationFilePath()));
    settings.sync();
#endif
2 января 2016 г. 21:33

Qt/C++ - Урок 041. JSON файл - получаем с сайта и производим его разбор

РуководствоQtJSON, QJsonArray, QJsonDocument, QJsonObject, QJsonValue, QNetworkAccessManager4887

В процессе написания программы EColor появилась задача, в которой было необходимо каким-то образом уведомлять пользователя о том, что вышла новая версия программы. Решением этой задачи стало наличие JSON файла на сайте. С помощью QNetworkAccessManager получаем JSON файл и производим его разбор, благодаря классам библиотеки Qt : QJsonDocument, QJsonObject, QJsonArray. В случае с программой EColor на сайте содержится JSON файл с названием программы, полной версией в строковом варианте и тремя объектами с Мажорной частью версии, Минорной и Патч-версией. При разборе файла производится сравнение текущей версии программы с той, которая находится на сайте. В случае, если на сайте выложена более свежая версия, то программа сообщает об этом пользователю.

27 декабря 2015 г. 20:09

Qt/C++ - Урок 031. QCustomPlot - строим график по времени

РуководствоQtQCustomPlot, QDateTime, Qt, время, график5482

Библиотека QCustomPlot имеет возможность построения графиков по шкале времени, что удобно при анализе данных, которые изменяются во времени. Для этого необходимо установить тип подписи к Оси Времени в качестве QCPAxis::ltDateTime. И после этого выставить формат даты и времени. То есть имеется возможность отображать на Оси или дату, или время, или одновременно и то и другое, в зависимости от того, какое форматирование Вы зададите. Правила форматирования для QCustomPlot используются те же, что и для классов QDateTime, QDate, QTime.

Координата времени передаётся в виде числа типа double , которое начинает отсчёт в секундах от времени 1970-01-01T00:00:00 . Что необходимо учитывать при построении графика.

Предлагаю написать приложение, которое будет строить псевдослучайный график дохода и рублях в зависимости от текущей координаты времени. При этом с графиком можно будет взаимодействовать, то есть приближать и удалять его, а также передвигать, но только по горизонтальной Оси. То есть по высоте отображение графика изменяться не будет. Также сделаем возможность изменения формат координат времени в зависимости видимой области графика по Оси Времени. То есть, если видна часть графика меньше, чем за один день, то по оси времени формат подписей будет следующий: hh:mm . В противном случае формат будет "dd MMM yy" .

Строим График

Создаём проект и подключаем в него библиотеку QCustomPlot. Модификации будут подвергаться только файлы mainwindow.h и mainwindow.cpp. Новые файлы добавляться не будут.

24 декабря 2015 г. 21:27

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

РуководствоQMLQt, QML, window, Quick, Controls, QtQuick2386

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

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

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

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

AnotherWindow.qml

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

23 декабря 2015 г. 23:07

Qt/C++ - Урок 037. Двумерный массив с помощью QVector

РуководствоQtQt, QVector, двумерный, одномерный, массив4203

Класс QVector относится к контейнерным классам и обеспечивает доступ к элементам по индексу, а также ряд дополнительных методов для удобства работы.

Экземпляр класса QVector по сути является одномерным массивом объектов. Если требуется задать в виде Вектора двумерный массив, то можно создать экземпляр QVector, который будет содержать другие экземпляры QVector.

Одномерный массив с помощью QVector

Для начала сохраним в Вектор одномерный массив типа int:

QVector <int> myVector;

int massive[4] = {1, 2, 3, 4};

for(int i = 0; i < 4; i++)
{
    myVector.push_back(massive[i]);
    qDebug() << "Value " << i << ": " << myVector.value(i);
}

И посмотрим вывод qDebug() :

Value  0 :  1
Value  1 :  2
Value  2 :  3
Value  3 :  4
23 декабря 2015 г. 20:36

Qt/C++ - Урок 032. Сохранение изображения в файл из QCustomPlot

РуководствоQtbmp, jpg, pdf, png, QCustomPlot, Qt, сохранение, файл2163

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

Методы для сохранения изображения

saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality)
saveJpg(const QString &fileName, int width, int height, double scale, int quality);
savePng(const QString &fileName, int width, int height, double scale, int quality);
saveBmp(const QString &fileName, int width, int height, double scale);
savePdf(const QString &fileName, bool noCosmeticPen, int width, int height, const QString &pdfCreator, const QString &pdfTitle);

saveRastered

Является основополагающим методом для методов: saveJpg, savePng, saveBmp. То есть он вызывается во всех этих методах. Внутри метода saveRastered создаётся экземпляр QPixmap, посредством которого сохраняется изображение из виджета QCustomPlot. Для данного метода можно указать тип сохраняемого файла. Тогда как остальные три метода просто упрощают работу и написание кода, отменяя необходимость указания типа файла.

savePdf

Данный метод стоит особняком и не использует QPixmap , а работает через QPrinter . Хотя логика использования в минимальном варианте аналогична остальным методам.

18 декабря 2015 г. 22:30

Qt/C++ - Урок 036. QWebView - пишем простейший браузер на Qt

РуководствоQtQt, QWebView, ssl, webkit, браузер4186

Внимание: Урок является устаревшим. С версии Qt5.6 необходимо использовать WebEngine

Ну кто из нас не хочет написать свой браузер? Да ладно, не отпирайтесь мысли про браузер, точно были. Так вот, Qt имеет класс QWebView, который позволяет работать с браузерным движком webkit, на котором написан chromium, а соответственно и chrome и многие другие браузеры. Поэтому практически использовав десяток строк кода можно сделать приложение, которое сможет отобразить страницу веб-сайта.

Итак, приложение будет следующим. Имеется адресная строка QLineEdit и виджет QWebView. При вводе адреса сайта в адресную строку и нажатии клавиши Enter будет запускаться получение страницы сайта и отображение её в QWebView. При клике по ссылке на странице адрес ссылки будет отображаться в адресной строке и будет загружаться новая странице в виджете.

Структура проекта для работы с QWebView

  • QWebViewExample.pro - профайл проекта;
  • main.cpp - основной файл исходных кодов проекта;
  • mainwindow.h - заголовочный файл главного окна приложения;
  • mainwindow.cpp - файл исходных кодов главного окна приложения;
  • mainwindow.ui - форма главного окна приложения.
Реклама
  • BoostEX
  • 17 августа 2017 г. 16:45

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

  • Результат - 73 баллов
  • Nordman
  • 15 августа 2017 г. 20:40

C++ - Тест 005. Структуры и Классы

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

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

  • Результат - 33 баллов
Последние комментарии
  • EVILEG
  • 17 августа 2017 г. 18:33

Qt/C++ - Урок 069. Шифрование методом XOR

Не обратил внимания на это, Проверял с большим текстом.. По идее не должно.

Qt/C++ - Урок 069. Шифрование методом XOR

Шифрует/дешифрует текст от 8 символов, так и должно быть?

  • EVILEG
  • 15 августа 2017 г. 20:32

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

Нууу... тут уже вопрос к самому Qt4.8. Если честно, идей нет, да и копаться в deprecated коде желания тоже нет.

  • t000r
  • 15 августа 2017 г. 19:49

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

В qt5.6 всё нормально заработало. С 4.8 - нет

  • EVILEG
  • 15 августа 2017 г. 17:44

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

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

Сейчас обсуждают на форуме
  • EVILEG
  • 19 августа 2017 г. 17:47

Проблемы с памятью

Добрый день! При работе со StackView, когда вы делаете push страниц, они постоянно добавляются и добавляются. Они не должны в данном случае удаляться, если вы просто пушите страницы в Sta...

  • MinusNol
  • 18 августа 2017 г. 16:22

WINAPI и Qt.

Да, покопаюсь. С WINAPI плохо знаком :) Но я уже существенно улучшил свой код благодаря вашему совету, благодарю вас :)

  • alex_lip
  • 18 августа 2017 г. 13:50

Я только учусь..(как правильно присвоить значение объекту другого класса)

хм. Похоже файл где-то в кэше остался. Я его второй раз  не прикреплял.

Сборка Qt / C++ проекта под windows и linux

нет, я тут кое что попробую- о результатах скажу)))

  • EVILEG
  • 16 августа 2017 г. 13:38

Перевод кодировки строки из windows 1251 в Utf-8

Здесь необходимо использовать QTextCodec. Вещь это очень хитрая в том плане, что объект этого класса необходимо создавать с определённой кодировкой. Поскольку он будет гонять данные от заданной код...