© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
1 апреля 2017 г. 16:16

QtQt Linux - Урок 003. Проверка уровня заряда батареи ноутбука с помощью libacpi

Qt, Battery, libacpi

Зашёл на форуме разговор про проверку уровня заряда батареи ноутбука под Linux с помощью библиотеки Qt. По факту Qt не предоставляет на данный момент такого класса, который давал бы возможность проверять заряд батареи.Но такой функционал можно реализовать с помощью третьесторонних библиотек, например libacpi.

Попробуем создать приложение, которое будет забирать хоть какие-нибудь данные, и которое будет выглядеть следующим образом:

30 марта 2017 г. 17:47

QtQt/C++ - Урок 061. Добавление изображений в приложение методом Drag And Drop из файлового менеджера

QDropEvent, QStyledDelegate, QStandardItemModel, QListView

Напишем небольшое приложение, которое позволит методом Drag And Drop перетаскивать изображения из файлового менеджера в само наше приложение. При этом в приложении будет область просмотра изображения и список всех изображений, которые мы поместили в наше приложение. При этом при клике по изображению в списке в область основного просмотра будет помещаться изображение, по которому мы кликнули. В данном списке будет формироваться у каждого элемента превью изображения без текста. Такое превью будет формироваться с помощью делегата, наследованного от QStyledDelegate.

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

27 марта 2017 г. 17:20

QtQt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме

QStyle, QStyleFactory, Fusion, QPalette

Допустим есть задача изменения внешнего вида приложения, написанного на QWidget . Для изменения стиля приложения приложения можно использовать как QPalette классы, так и установку стиля через QStyleSheet для конкретных элементов, так и с использованием QStyle класса и встроенных стилей, получаемых с помощью QStyleFactory (Или созданных самостоятельно с помощью QStylePlugin ).

Посмотрим на два варианта оформления стиля приложения с использованием встроенного стиля Fusion. А именно будет тёмное оформление и светлое .

26 марта 2017 г. 5:45

DjangoDjango - Урок 021. Наследование моделей, абстрактная модель

model, Django, наследование

После проведения рефакторинга на сайте, было выделено четыре основных сущности, у которых были выделены общие свойства, а именно:

  • Article - Статьи
  • Comment - Комментарии
  • ForumTopic - Темы форума (они же вопросы)
  • ForumPost - Ответы к темам форума

Конечно, и так было ясно, что эти сущности могут иметь одинаковые поля данных, одинаковые методы и т.д. Но при разработке данного сайта я и сам одновременно изучаю Python и Django. Поэтому проект носит характер хаотичного внесение небольших ToDo с последующим рефакторингом при изучении лучших подходов. Поэтому после изучения возможностей наследования моделей в Django, была выделена одна общая абстрактная модель данных PostBase , которая имеет четыре поля, которые повторяются во всех выше перечиcленных моделях.

Здесь есть один важный момент: Модель, которая объявляется абстрактной, не будет создавать таблицу в базе данных.

Чтобы создать абстрактную модель необходимо установить переменную abstract в значение True для класса Meta.

15 марта 2017 г. 18:12

DjangoDjango - Урок 020. Добавление пагинации статей на сайте с помощью ListView и django-bootstrap3

Pagination, Django, django-bootstrap3, ListView

В одной из предыдущих статей был показан вариант внедрения страницы с пагинацией статей, которая может быть главной странице сайта, например. При этом применялся django-bootstrap3.

Но если страница не представляет какого-то особенного функционала, кроме отображения списка статей, например, то необходимо использовать классы дженерики. Одним из которых является ListView . Это позволит сократить программный код проекта и соответственно упростить его.

Класс ListView позволяет указать шаблон, который будет рендериться для отображения таблицы, указать модель данных или queryset, который необходимо будет показать, а также количество объектов на страницу, которые будут выводиться при пагинации.

IndexView

Давайте вспомним, как выглядел предыдущий вариант View класса для отображения списка страниц.

class IndexView(View):
 
    def get(self, request):
        context = {}
        # Забираем все опубликованные статье отсортировав их по дате публикации
        all_articles = Article.objects.filter(article_status=True).order_by('-article_date')
        # Создаём Paginator, в который передаём статьи и указываем, 
        # что их будет 10 штук на одну страницу
        current_page = Paginator(all_articles, 10)
 
        # Pagination в django_bootstrap3 посылает запрос вот в таком виде:
        # "GET /?page=2 HTTP/1.0" 200,
        # Поэтому нужно забрать page и попытаться передать его в Paginator, 
        # для нахождения страницы
        page = request.GET.get('page')
        try:
            # Если существует, то выбираем эту страницу
            context['article_lists'] = current_page.page(page)  
        except PageNotAnInteger:
            # Если None, то выбираем первую страницу
            context['article_lists'] = current_page.page(1)  
        except EmptyPage:
            # Если вышли за последнюю страницу, то возвращаем последнюю
            context['article_lists'] = current_page.page(current_page.num_pages) 
 
        return render_to_response('home/index.html', context)
15 марта 2017 г. 17:10

PyQt5PyQt5 - Урок 006. Работа с QTableWidget

PyQt5, Python, QTableWidget

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

Выглядеть таблица будет следующим образом:

15 марта 2017 г. 16:12

PyQt5PyQt5 - Урок 005. Автодополнение для поля ввода с помощью QCompleter

PyQt5, QCompleter, Python, QLineEdit

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

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

# Создаём поле ввода
lineEdit = QLineEdit(self)
strList = ['Python', 'PyQt5', 'Qt', 'Django', 'QML']    # Создаём список слов
# Создаём QCompleter, в который устанавливаем список, а также указатель на родителя
completer = QCompleter(strList, lineEdit)
lineEdit.setCompleter(completer)        # Устанавливает QCompleter в поле ввода
3 февраля 2017 г. 16:55

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

QQuickWidget, QML, C++, QWidget

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

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

27 января 2017 г. 12:53

QtПоддержка OpenGL Core Profile Context в QPainter

Qt 5.9, qtbase, OpenGL, QOpenGLWindow, QOpenGLWidget

Как многим известно, QPainter имеет архитектуру с несколькими бэкэндами и имеет две основных реализации отрисовки под капотом Qt 5: Это растровый движок отрисовки и движок OpenGL2, который предназначен для OpenGL ES 2.0.

GL Paint Engine

В то время как движок растровой отрисовки является одним из драгоценных камней Qt, давайте поговорим о второй половине: движок отрисовки GL, который используется, когда открывается QPainter на:

26 января 2017 г. 17:07

QtПодключение вашего Qt приложения к сервисам Google, используя OAuth 2.0

Qt, OAuth2, Google API, QtNetworkAuth

С выпуском Qt 5.8 был добавлен модуль QtNetworkAuth в качестве технологии на предварительном рассмотрении. Он сфокусирован на помощи разработчикам с их безумием в аутентификации. На данный момент поддерживаются OAuth1 и OAuth2 . В будущем будет включено ещё несколько методов авторизации.

Данный пост ориентирован на поддержку OAuth2 в Qt. Здесь показано, как использовать авторизацию Google в приложении. Ваше приложение будет способно показать типичное окно авторизации, как в веб-приложении (Примечание: требуется браузер или WebView).

IETF определяет OAuth 2.0, как:

OAuth 2.0 фреймворк авторизации позволяет третьим приложениям получить ограниченный доступ к HTTP сервисам, либо со стороны владельца ресурса для организации взаимодействия  между владельцем ресурса и HTTP сервисом, либо разрешить приложениям третьей стороны получить собственный доступ.

OAuth авторизация также является требованием использования Google API и доступа пользователя к информации, которая хранится в сервисах Google, таких как Gmail, Drive, Youtube, Maps, и других.

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

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

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