© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
1 июля 2017 г. 10:03

QMLQML - Урок 028. Регистрация пользовательских enum в QML

QML, enum, qmlRegisterType

Для того, чтобы использовать в QML перечисления enum, прописанные в C++, необходимо создать класс, наследованный от QObject, и зарегистрировать его в качестве QML Type перед запуском QML движка  в приложении.

Для изучения создайте проект с использованием QtQuick.

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

#ifndef INFO_H
#define INFO_H

#include <QObject>

class Info : public QObject
{
    Q_OBJECT
public:
    enum State {
        Information,
        Debug,
        Warning,
        Error
    };
    Q_ENUM(State)
};

#endif // INFO_H
28 июня 2017 г. 16:10

QtСоздание командной строки на Qt Creator с помощью класса QProcess

Qt, QProcess, командная строка

С помощью класса QProcess можно создать собственную консоль работы с командной строкой. Для этого достаточно следующего: создадим приложение с графическим интерфейсом и разметим на главном окне объекты классов QLineEdit и QTextEdit (lineEdit и textEdit), для написания запроса и отображения результата запроса. Добавим к нашему классу объект типа QProcess. Он необходим для выполнения системных команд. Создадим два слота. Слот command() для выполнения командного запроса. Этот слот мы подключает к сигналу returnPressed() объекта lineEdit. Слот будет вызываться при нажатии клавиши «Enter», когда в фокусе наша строка для ввода текста. При его выполнении происходит считывание текста из lineEdit и его передача в качестве аргумента функции start() объекта класса QProcess. Для работы на ОС Windows необходимо добавить к строке команды префикс "cmd /C ". Слот setStdout() будет принимать поток данных, полученный от объекта класса QProcess и отображать его в textEdit. Здесь необходимо учитывать ещё одну особенность Windows заключается в том, что кодировки в командной строке и самой ОС отличаются. Конвертирование можно провести с помощью метода toUnicode() класса QTextCodec. При этом надо установить кодировку "IBM 866".

28 июня 2017 г. 6:31

Карьера и бизнес в ITEVILEG - Празднуем 2 года и подводим итоги

EVILEG, 2 года

Настал знаменательный день! Ресурс EVILEG празднует два года со дня своего основания - 28 июня 2015 года.

Два года назад был зарегистрирован первый домен ресурса EVILEG в зоне RU, поднят сайт на Wordpress и началась работа над статейными материалами.

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

И теперь настало время подвести итоги двухлетнего развития сайта EVILEG, чей рост неразрывно связан с моим собственным профессиональным ростом. В данном случае одно от другого неотделимо.

23 июня 2017 г. 8:12

DjangoDjango - Урок 025. Комплект полезных батареек Django

Battery, tagging, Framework, Django, ckeditor, REST, django-bootstrap3

Удобство разработки на Django заключается не только в том, что это уже достаточно развитый Framework с богатым функционалом, но и в наличии большого количества качественных батареек (пакетов), которые реализуют необходимый функционал, писать который самостоятельно было бы довольно затруднительно, особенно если вы занимаетесь разработкой сайта в одиночку.

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

  1. django-ckeditor
  2. django-autocomplete-light
  3. django-tagging
  4. django-bootstrap3
  5. django-modeltranslation
  6. django-daterange-filter
  7. django-phonenumber-field
  8. django-rest-framework
22 июня 2017 г. 10:17

LinuxНастройка HTTPS от Let`s Encrypt с помощью Certbot

LetsEncrypt, Ubuntu, Nginx, HTTPS, SSL, HTTP

Некоторое время назад на сайте перестал обновляться SSL сертификат от Let`s Encrypt . Судя по ошибкам, несколько поменялась структура  файлов для организации ключей. После исследования проблемы наиболее простым вариантом представилась установка SSL сертификатов с помощью специальной утилиты Certbot . Данная утилита производит установку сертификатов в автоматическом режиме, а также автоматически создаёт задачу по обновлению сертификата, которая базируется либо в планировщике cron либо в systemd.

Поскольку сервер сайта работает на Ubuntu 16.04, то и комплект установки был выбран для этой ОС. В случае других ОС на сайте Certbot предоставляются мануалы и для других систем.

Если Вы производите настройку SSL сертификата впервые, то можно воспользоваться руководством на сайте Certbot, если Вы уже производили настройку сертификата с помощью других утилит, например, с помощью пакета letsencrypt без использования certbot, как показано в следующей статье , то скорее всего понадобится сделать небольшую чистку перед установкой Certbot `a.

15 июня 2017 г. 6:58

QtQt/C++ - Урок 067. Использование QMultiMap для словаря синонимов

Qt, QStandardItemModel, QMultiMap, QTableView

QMultiMap является классом, наследованным от QMap, который позволяет хранить несколько значений для одного ключа. То есть ключ может повторяться. Этот класс может быть использован, например, для представления словаря синонимов.

Напишем небольшую программу, которая будет содержать две таблицы:

  1. Таблицу с ключами
  2. Таблицу со значениями, которые будут являться синонимами слов в первой таблице.

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

Внешний вид приложения:

9 июня 2017 г. 10:37

C++C++ - Урок 004. Условия и циклы

C++, while, for, do, break, continue, if, else

C++ предоставляет стандартный набор операторов для условий выбора и циклов.

Ключевыми словами, относящимися к конструкциями условий ветвления кода, являются:

  • if
  • else
  • switch
  • case
  • break
  • default

Ключевыми словами, относящимися к конструкциям циклов, являются:

  • do
  • while
  • break
  • continue
  • for
6 июня 2017 г. 16:48

QtQt/C++ - Урок 066. Загрузка файлов на FTP сервер

Qt, QNetworkAccessManager, FTP

Для работы с сетью в Qt 5 используется модуль Network , а для передачи данных по сети можно активно использовать класс QNetworkAccessManager , если Вы не создаёте свой собственный протокол для передачи данных. Но для работы с FTP достаточно использования QNetworkAccessManager , с которым мы уже работали при реализации скачивания файла с сайта .

Напишем небольшую программу, которая будет загружать на сервер произвольный файл, который мы будем выбирать на нашем ПК с помощью диалога выбора файла. Также будет показан прогресс загрузки файла на FTP сервер.

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

5 июня 2017 г. 7:33

C++C++ - Урок 003. Константы

C++, const, constexpr

C++ поддерживает две нотации неизменности:

  1. const - которая подразумевает, что значение не будет изменяться. В первую очередь это используется для спецификации интерфейсов, для данных которые передаются в функции и методы так, чтобы не опасаться, что они будут изменены. Компилятор отслеживает наличие спецификатора const;
  2. constexp - который подразумевает вычисление константы во время компиляции. Используется для размещения данных в памяти, где они не будут повреждены, а также для улучшения производительности.

Например:

const int dmv = 17;                      // константа с именем dmv
int var = 17;                            // переменная var не является константой
constexpr double max1 = 1.4∗square(dmv); // OK, так как square(17) является константым выражением
constexpr double max2 = 1.4∗square(var); // Ошибка, так как var не является константой
const double max3 = 1.4∗square(var);     // OK, поскольку выражение может быть вычислено в рантайме
double sum(const vector<double>&);       // sum не будет модифицировать его аргументы
vector<double> v {1.2, 3.4, 4.5};        // v не является константой
const double s1 = sum(v);                // OK, будет вычислено в рантайме
constexpr double s2 = sum(v);            // Ошибка, sum(v) не является константным выражением.
4 июня 2017 г. 8:52

PostgreSQLИсправление клиентской кодировки базы данных PostgreSQL с LATIN1 на UTF8

PostgreSQL, Django, LATIN1, UTF8

На сайте был один баг, который проявлялся при попытке прикрепления к сообщениям файлов, названия которых были на кириллице. В данном случае сайт выдавал ошибку 503. Это происходило несмотря на то, что кодировка базы данных была в UTF8, после исправления кодировки самой базы данных в предыдущей статье . Тогда как Django выдавал следующее сообщение:

'latin-1' codec can't encode characters in position 55-64: ordinal not in range(256)

Проблема заключалась в том, что кодировка сервера была первоначально выставлена в LATIN1. То есть следующие команды давали следующий вывод:

postgres=# show server_encoding;
 server_encoding 
-----------------
 LATIN1
(1 row)

postgres=# show client_encoding;
 client_encoding 
-----------------
 LATIN1
(1 row)

postgres=# \encoding 
 LATIN1

Выполнение команды SET CLIENT_ENCODING TO 'utf8'; не давало результата, после выхода из psql кодировка возвращалась в LATIN1 .

21 мая 2018 г. 8:30
Nasty

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 10 баллов
  • Очки рейтинга -10
20 мая 2018 г. 12:26
Venic

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

  • Результат 58 баллов
  • Очки рейтинга -2
20 мая 2018 г. 12:16
Venic

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 90 баллов
  • Очки рейтинга 8
Последние комментарии
19 мая 2018 г. 12:44
EVILEG

Django - Snippet 001. get_object_or_none

А вы гарантируете, что метод first вернёт нужный объект, если в таблице две похожих записи? Этого никто не гарантирует. Может возникнуть неопределённое поведение приложения, если запись не так...
19 мая 2018 г. 12:34
Pavel

Django - Snippet 001. get_object_or_none

Согласен с тем что ваше решение более очевидно при чтении кода. first() же здесь применяется не совсем по назначению. А с последствиями "моего" решения не согласен. Метод вернёт только один об...
19 мая 2018 г. 12:27
EVILEG

Как я использовал FilterView заместо ListView для упрощения фильтрации

Может быть, а может и нет, все имеют различную речь.. не могу отвечать за всех пользователей ресурса.. поскольку каждый пользователь может дополнить материал ресурса статьями.
19 мая 2018 г. 12:25
EVILEG

Django - Snippet 001. get_object_or_none

В вашем случае происходит подмена сущностей. Вместо того, чтобы взять один конкретный объект, вы забираете queryset а потом берёте из него первый объект. Нехорошо будет, если queryset в каком-...
19 мая 2018 г. 11:11
Pavel

Django - Snippet 001. get_object_or_none

Тоже искал подобную функцию, чтобы не обрабатывать каждый раз исключения. И нашёл на so совет использовать вместо неё метод менеджера first(), который возвращает None при пустом queryset. Т.е ...
Сейчас обсуждают на форуме
21 мая 2018 г. 16:18
otvertka

Выводит мусор

Да, мыши. Т.е. мне надо создать класс-потомок от QPushButton, и там переопределить метод mousePressEvent? И как тогда у  Buttons поменять класс на созданный?
20 мая 2018 г. 2:05
vitaliy_antipov

Удаление серии из графика

Ой, извините, совсем запарился. Туплю: void MainWindow::onDelSeries(int i){ chartview->chart()->findChild<QLineSeries *>("obj" + QString::number(i))->deleteLater();...
18 мая 2018 г. 8:55
mak_trefa

Сборщик мусора и Connections в qml

можешь попробовать в деструкторе модели вызвать throw; и в дебагере посмотреть stacktrace
17 мая 2018 г. 20:30
EVILEG

Нарисовать дугу в QGraphicsItem

Добрый день! Оу, я смотрю по гитхабу, что вы уже разобрались с проблемой. Извиняюсь, заработался и забыл про ваш вопрос.
17 мая 2018 г. 15:34
Евгений_Канусовский@1981

Проблема с combobox

Спасибо за очередную помощь!

Рекомендуемые страницы