Реклама
3 мая 2017 г. 22:23

Qt/C++ - Урок 064. Как скрыть элементы из выпадающего списка QComboBox

РуководствоQtQt, QComboBox, QListView1609

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

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

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

Второй вариант с флагами не подходит потому, что нет такого флага, который бы заставил QComboBox скрыть определённый элемент в списке, хотя наиболее близким по значению является флаг Qt::ItemIsEnabled , но если его сбросить, то тогда текст элемента становится серым, показывая, что элемент нельзя выбрать.

Ещё можно рассмотреть вариант с моделью данных и отрисовкой элементов, но мы опять же возвращаемся к QItemDelegate , который опять же не работает.

30 апреля 2017 г. 22:17

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

РуководствоDjangoDjango, Like, Dislike, GenericForeignKey, GenericRelation2219

В статье по созданию системы закладок на Django был рассмотрен пример с использованием абстрактной модели для нескольких типов закладок, а именно для статей и комментариев к статьям. Также было акцентировано внимание на том, что поля моделей, который имели внешние ключи на различные модели, должны иметь одинаковые названия, чтобы поддерживать возможность создания единого интерфейса для добавления закладок. Это становится возможным благодаря так называемой "утиной типизации" (Duck typing) , которая подразумевает, что объекты, которые не имеют единой иерархии наследования, могут использоваться в одном и том же сценарии при наличии интерфейсов (методов) имеющих одинаковую сигнатуру.

Дословно принцип утиной типизации звучит следующим образом:

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

If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck.

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

В данной же статье рассмотрим вариант, когда для создания системы Like Dislike используется не две различных таблицы для статей и комментариев, и даже не одна, которая будет содержать по внешнему ключу на статью или комментарий (то есть две колонки, и при этом будет заполняться только одна из колонок в зависимости от того, к какому типу контента относится активность пользователя), а одна таблица, которая будет содержать:

  • content_type - тип контента, к которому относится запись
  • object_id - ID записи
  • content_object - генерируемый внешний ключ на запись, по сути объект контента
  • прочие дополнительные поля
25 апреля 2017 г. 22:23

Qt/C++ - Урок 063. Добавление окон внутри главного окна приложения с помощью QMdiArea

РуководствоQtQMdiArea, QWidget, Qt1019

Многие приложения, наподобие фотошопа умеют открывать проекты (изображения, тексты и т.д.) внутри окон, которые открываются внутри основного окна приложения. Qt предоставляет подобный фукционал в виде класса QMdiArea. В объект данного класса можно помещать объекты классов, наследованных от класса QWidget , и соответственно класса QWidget. Эти объекты будут отображать как окна, только будут расположены внутри QMdiArea.

Посмотрим пример с окном внутри окна.

8 апреля 2017 г. 17:52

Django - Урок 022. Добавление системы закладок (избранное) на сайте

РуководствоDjangoDjango, jQuery, AJAX, bookmark, favorite924

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

Для того, чтобы реализовать систему закладок, необходимо:

  • Добавить таблицу, которая реализует отношение Many-to-Many между пользователем и статьёй или комментарием.
  • Добавить view, который будет обрабатывать данный запрос.
  • Добавить url для обработки запроса на добавление или исключение объекта из избранного.
  • Написать html-код, который будет отвечать за отображение счётчика добавленного в закладки.
  • Добавить javascript обработчик, который будет вызывать AJAX-запрос.

На данном сайте в качестве иконки счётчика используется иконка звезды из Bootstrap.

7 апреля 2017 г. 13:22

Qt/C++ - Урок 062. Компаратор для сортировки QList

РуководствоQtQList, sort, сортировка1111

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

Напишем небольшой компаратор, который будет сортировать объекты класса QPointF . Правила сортировки будут простые. В первую очередь сортировка должна производиться по координате X, а если координаты X совпадают, то производим сортировку по координате Y.

То есть, до сортировки список может выглядеть так:

(QPointF(12.4,15.4), QPointF(14.1,7.5), QPointF(7.2,5.2), QPointF(4.2,18.5), QPointF(4.2,1.2), QPointF(-19.5,12.4), QPointF(1.1,1.2))

После сортировки список будет выглядеть так:

(QPointF(-19.5,12.4), QPointF(1.1,1.2), QPointF(4.2,1.2), QPointF(4.2,18.5), QPointF(7.2,5.2), QPointF(12.4,15.4), QPointF(14.1,7.5))
3 апреля 2017 г. 0:22

PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты)

РуководствоPyQt5PyQt5, QML, QtQuick, Signal, Slot1530

А теперь более глубоко погрузимся в работу с Qt с помощью PyQt5, воспользовавшись современными возможностями Qt. Под такими возможностями я подразумеваю QtQuick и QML. PyQt5 позволяет использовать классы Qt, которые могут обрабатывать QML код, а следовательно, можно написать интерфейс на QML, а также передавать сигналы в QML слой и вызывать слоты объектов, наследованных от QObject из QML слоя.

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

  • Интерфейс программы должен быть написан на QML
  • Должен быть реализован класс, наследованный от QObject и написанный на python, с которым будем взаимодействовать из QML
  • Приложение с помощью данного класса должно будет складывать и вычитать целые числа

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

1 апреля 2017 г. 22:16

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

РуководствоQtQt, Battery, libacpi1439

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

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

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

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

РуководствоQtQDropEvent, QStyledDelegate, QStandardItemModel, QListView2419

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

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

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

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

РуководствоQtQStyle, QStyleFactory, Fusion, QPalette1549

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

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

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

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

РуководствоDjangoDjango, наследование, model878

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

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

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

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

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

Реклама
Последние пройденные тестирования
  • namat
  • 22 июня 2017 г. 5:27

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

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

  • namat
  • 22 июня 2017 г. 5:22

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

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

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

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

Последние комментарии
  • EVILEG
  • 16 июня 2017 г. 12:15

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Не, не совсем так. Здесь нужно будет учитывать сдвиг позиции курсора относительно координаты (0, 0) в координатной системе MoveItem. Получается тогда так: Координаты сдвиг...

  • damix
  • 15 июня 2017 г. 21:39

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

Лучше где-то в классе MoveItem объявить QPointF mouseCoords; А потом void MoveItem::mousePressEvent(QGraphicsSceneMouseEvent *event){ mouseCoords = event->pos();}void...

  • EVILEG
  • 15 июня 2017 г. 13:27

QML - Урок 007. ListView Qml. Динамическое создание и удаление элементов

Не хотелось бы повторяться. В статье по сигналам и слотам в QML есть вариант использования C++ объекта. Там используется тип Connections , который можно настроить на сигн...

Сейчас обсуждают на форуме

QEvent. Переопределение метода event().

EVILEG, благодарю, что все разъяснили. ;)

  • EVILEG
  • 17 июня 2017 г. 13:13

QWizard

Думаю, что это возможно. У QWizard есть метод setButtonLayout , который устанавливает, какие именно кнопки могут быть видны на страницах. Так вот, у QWizardPa...

  • DrGen
  • 15 июня 2017 г. 17:10

Ключи QMultiMap в роли кнопок

Большое спасибо! даже не думал, что вопрос окажется интересным.

Вопрос по QTableWidget ?

Спасибо )