Реклама
27 марта 2017 г. 17:20

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

QStyle, QStyleFactory, Fusion, QPalette

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

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

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

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

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

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

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

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

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

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

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

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

Django, Pagination, ListView, django-bootstrap3

В одной из предыдущих статей был показан вариант внедрения страницы с пагинацией статей, которая может быть главной странице сайта, например. При этом применялся 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, и других.

25 января 2017 г. 15:07

QtQt 5.8 released

Qt Lite, Qt 5.8, QML, Charts, Wayland, CAN, Modbus, Quick

23-го января Qt Company анонсировала выпуск Qt 5.8, с рядом нововведений, которые носят достаточно глобальный характер. Давайте ознакомимся с ними.

Qt Lite

Одной из главных тематик Qt 5.8 стало сделать так, чтобы Qt был более гибким и лёгким к адаптации к целям пользователей, в частности для разработчиков встраиваемых систем. Qt Lite является кодовым именем проекта, целью которого является внедрение данных целей.

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

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

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

22 января 2017 г. 15:33

QtQt/C++ - Урок 059. Требуется ли удалять QStandardItem из памяти вручную при вызове метода clear в модели данных?

QStandardItem, QStandardItemModel

При работе с таблицами, да и вообще с различными данными в C++ требуется контроль над удалением, чтобы не было утечек памяти. Но требуется ли такой тотальный контроль при удалении объектов QStandardItem помещённых в QStandardItemModel , у которой вызвали метод clear ?

Такой вопрос может возникнуть исходя из того, каким образом обычно добавляются объекты QStandardItem в QStandardItemModel, а именно:

QList<QStandardItem *> items;
items.append(new QStandardItem("Item 1"));
items.append(new QStandardItem("Item 2"));
items.append(new QStandardItem("Item 3"));
model->appendRow(items);

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

Когда объект QStandardItem передаётся в QStandardItemModel , то права собственности на данные объекты передаются в модель. И при вызове метода clear модель автоматически удаляет эти объекты из памяти.

Реклама

Qt - Тест 001. Сигналы и слоты

  • Результат 5 баллов
  • Очки рейтинга -10

C++ - Тест 003. Условия и циклы

  • Результат 57 баллов
  • Очки рейтинга -2

C++ - Тест 003. Условия и циклы

  • Результат 7 баллов
  • Очки рейтинга -10
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

Визуальный пример чего? комментариев? При ответе на конкретный комментарий рядом с ником отвечающего будет стрелочка и указание ник другого пользователя. Который будет ссылкой на коммента...

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...

  • EVILEG
  • 13 декабря 2017 г. 7:57

А что по поводу авторизации ?

Наличие токена - это правильный подход. Например, у меня на сайте в каждой форме есть токен, чтобы не было возможности подделки запросов. Что касается SSL, то стоит поискать информацию н...