16 января 2015 г.

Работа с Graphics View Framework в Qt

    В данный момент работаю с SVG-графикой в Qt и чтобы не забыть того, что узнал из работы с Graphics View Framework хочу написать данный цикл статей, пока эти знания у меня из головы не вылетели. Возможно кому-то кроме меня он окажется полезен, и я буду только рад этому. Сразу хочу сказать что, где-то могут быть ошибки и неточности. Я не профи в этом и только учусь.
    Не хочу расписывать подробно "что это такое", это уже давно сделали до меня. Приведу лишь одну схему, поясняющую модель взаимодействия объектов:

    И по отдельности хочу рассказать про каждый класс, и те нюансы с которыми мне пришлось столкнуться.

Краткое описание каждого из них. 

    QGraphicsView - класс представления, он отвечает за отрисовку всех элементов, и именно его нужно добавлять внутрь ваших виджетов. В QtDesigner имеется. Наследуется от QAbstractScrollArea, а это означает, что, если отображение не помещается внутрь заданной области, то будут добавлены полосы прокрутки.
    QGraphicsScene - класс сцены, хранит в себе элементы, и это самое главное и понятное. Может быть привязан к нескольким сценам.
    QGraphicsItem - класс элемента, все элементы сцены должны быть потомками от этого класса. Сам класса QGraphicsItem является абстрактным, от него нужно создать собственный класс и переопределить в нем хотя бы методы paint() и boundingRect(). Но обычно этого не требуется ведь есть много уже готовых классов, например, прямоугольники (QGraphicsRectItem), эллипсы (QGraphicsEllipseItem) и текстовые элементы (QGraphicsTextItem). Проще отнаследоваться от них переопределив нужные методы. Да, кстати, данный класс не наследуется от QObject, а это значит, что нем не реализован сигнально-слотовый механизм. Но есть прекрасный класс QGraphicsObject, в котором это есть, но использовав его вы жертвуете производительностью.
   

Теперь об основах работы с ними.

    Допустим, что объект QGraphicsView уже добавлен в виджет, и мы хотим его связать со сценой:
QGraphicsScene *scene = new QGraphicsScene;
graphicsView->setScene(scene);
    или можно так
QGraphicsScene scene(QRectF(-100, -100, 300, 300));
graphicsView->setScene(&scene);
Чтобы добавить элемент на сцену, например линию:
QGraphicsLineItem *pLineItem =
scene.addLine(
   QLineF(-10, -10, -80, -80),
   QPen(Qt::red, 2)
);
    Дальше обращаясь к объекту pLineItem мы можем его менять, прямо на сцене.
    Поподробней про элементы сцены. У них есть собственные локальные координаты и координаты сцены (как минимум, есть правда еще, но пока что забудем о них).
    Под локальными понимается координаты внутри данного объекта. Т.е. его начало координат будет в левом верхнем углу. Для преобразования из одной системы в другую - используются методы элемента mapTo...() и mapFrom...()
    Например, нужно узнать середину квадрата в координатах сцены внутри класса предка QGraphicsRectItem. Объект этого класса назовем myRect.
void showMiddlePoint()
{
    qDebug() <<
mapToScene(QPointF(boundingRect().width()/2,             boundingRect().height()/2));
}
    Удобно вызывать внутри этого метода сигнал, который связать со слотом отрисовки этой точки. Дополним.
void showMiddlePoint()
{
    qDebug() << mapToScene(QPointF(width()/2, height()/2));
    emit needDrawPoint(
             mapToScene(QPointF(width()/2, height()/2)                        );
}
connect( myRect, SIGNAL(needDrawPoint(QPointF())),
       this, SLOT(drawPoint(QPointF())));
void drawPoint(QPointF p)
{
    scene->addEllipse(
       QRectF(p.x(),p.y(),1,1),
       QPen(Qt::NoPen),
       QBrush(Qt::black)
    );
}
    Так же удобно отображать клик мыши на сцене создав предка от  QGraphicsScene и переопределив метод mousePressEvent().
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    emit clicked(event->scenePos());    event->accept();
}
connect(scene, SIGNAL(clicked(QPointF())),
        this, SLOT(drawPoint(QPointF())));
    Теперь про трансформацию элементов.
    Внутри каждого класса наследуемого от QGraphicsItem имеются методы transform() и setTransform(). Метод transform() возвращает объект класса QTransform, который позволяет выполнять различные преобразования над элементом (масштабирование, перемещение, поворот). Факт в том, что преобразованию подвергается локальная система координат. Т.е. все его характеристики внутри нее, будь то длина, ширина или конечные точки - остаются без изменений. Еще одна особенность в том, поворот (метод QTransform::rotate()) осуществляется вокруг локальной точки точки 0;0, причем вне зависимости от установки transformOriginPoint() у элемента. Если хочется вращать вокруг определенной точки нужно задать эту точку методом QGraphicsItem::setTransformOriginPoint() и затем вызвать QGraphicsItem::setRotation(). Пример:
void rotateAroundMiddle(qreal angle)
{
    QPointF p(boundingRect().width()/2,
              boundingRect().height()/2);
    setTransformOriginPoint(p);
    setRotation(angle);
}
    Немного про "родитей" у элементов.
    Для каждого элемента можно задать элемент, который будет его "родителем", и тогда все действия трансформации (поворот, масштабирование и пр.), которые будут производиться над основным элементом произойдут и над "дочерним" элементом, но только в системе координат "родителя". Весьма запутанная система получается. Задать "родителя" можно методом setParentItem().

    Теперь немного про флаги у элементов.
    Устанавливаются они через метод setFlag() или setFlags(). Первый - устанвливает только один флаг, второй метод - одновременно несколько, разделенные "|". Например:
item1->setFlag(QGraphicsItem::ItemStacksBehindParent);
item2->setFlags(QGraphicsItem::ItemStacksBehindParent
                | QGraphicsItem::ItemIsMovable);
item3->setFlags(QGraphicsItem::ItemStacksBehindParent
                | QGraphicsItem::ItemSendsGeometryChanges
                | QGraphicsItem::ItemIsMovable);
    Подробнее о представленных флагах. Флаг ItemStacksBehindParent - делает так чтобы родитель был позади (на заднем плане) потомка, флаг ItemIsMovable - позволяет перемещать элементы мышью, флаг ItemSendsGeometryChanges - позволяет отхватывать события методом QGraphicsItem::itemChange().
    Теперь о работе с SVG в Qt.
    Для простой работы достаточно класса QSvgWidget
QSvgWidget svg(":/motion.svg");
svg.show();
    Но мне этого было мало и я создал свой класс-потомок QGraphicsSvgItem. Объекты этого класса можно добавлять на сцену, и работать с ними как QGraphicsItem. Прежде всего их нужно правильно создать и связать с нужным объектом SVG. Я делаю это так:
QSvgRenderer *renderer = new
    QSvgRenderer(QString(":/motion.svg"));
QGraphicsSvgItem *item = new QGraphicsSvgItem();
item->setSharedRenderer(renderer);
item->setElementId("rect1");
item->setPos(renderer->boundsOnElement("rect1").topLeft());
scene->addItem(item);

    У каждого объекта в SVG свой ID по которому можно к нему обратиться. Рендерер же создается один раз для SVG-картинки. А с помощью метода setPos() изменяется положение элемента на сцене в соответствии с картинкой, иначе элемент будет располагаться в точке 0;0 на сцене.
    Пока что это всё, будет что-то новое - добавлю.

Используемый материал:
Qt 5. Graphics View Framework
Qt 4. Graphics View Framework
Каркас Графического представления
Красота и мощь Qt Graphics View Framework на примере
Программирование графического интерфейса с помощью Qt 4, Часть 4

При копировании статьи просьба указывать источник и автора.
С уважением, GRomR1.

12 комментариев:

  1. какое же убогое форматирование текста

    ОтветитьУдалить
  2. пунктуация и орфография тоже не на высшем уровне...

    ОтветитьУдалить
  3. Супер, молодец ��. А как быть с большим одностраничным svg файлом, размером не менее 1900 * 11200? QGraphicsView лагает от такого жестко..

    ОтветитьУдалить
  4. VarangaOfficial - лечит ли варанга грибок ногтей отзывы - мы работаем только с официальными источниками, и предоставляем вниманию наших пользователей исключительно проверенные, не подвергающиеся сомнениям, факты. Воспользовавшись нашим ресурсом, вы сможете узнать обстоятельную, полную информацию касательно данного лекарственного средства. Лично увидеть данные о проведенных клинических тестированиях, прочитать отзывы реальных пациентов и медицинского персонала. Ознакомиться с инструкцией по использованию, прочесть об особенностях и методах работы комплекса, осмыслить, почему крем Варанга настолько эффективен, где нужно покупать оригинальный препарат и, как избежать покупки подделки. Мы тщательно проверяем публикуемые данные. Предоставляем нашим пользователям сведения, которые были почерпнуты только из авторитетных источников. Если вы нашли признаки развития грибка или же долго и безрезультатно стараетесь избавиться от этого коварного недуга, наш сайт покажет вам легкий и быстрый способ устранения проблемы. Приобщайтесь и живите здоровой полноценной жизнью. Все, что вы хотели знать, теперь можно найти на одном ресурсе.

    ОтветитьУдалить
  5. В ситуации, когда вы хотите полностью оградить себя от скучных будней наших раскрепощенных, уверенных в себе кисок, тогда вам прямая дорога в секс-чат bongacams. Здесь вы можете легко найти красотку чат с парами, Которая соответствует вашему типу. Стройные блондинки и энергичные брюнетки, зажигательные и жизнерадостные женщины-вамп рады общаться и оставаться в тесном контакте в любое время. Просто загляните наедине к раскрепощенной ведьме и посмотрите увлекательное потоковое порно с новейшим другом. Наша платформа предоставляет возможность узнать о богине вашей мечты совершенно бесплатно, независимо от вашего положения в обществе или финансового достатка. Аналогичным образом, просмотр горячих трансляций видео секс-чатов не пробьет брешь в личном плане, потому что когда вы занимаетесь виртуальным сексом с эротическими цыпочками всю ночь напролет. Веб-камеры позволяют вам общаться с игривыми красотками по всей соседней планете. Мы работаем в основном с очаровательными русскими, зажигательными латиноамериканцами, экзотическими негритянками и послушными азиатками в любое время дня и ночи. Следите за нашим очарованием на bongacams. Com возможен при отсутствии регистрации. Но для более близкого знакомства с понравившейся девушкой вам нужно зарегистрироваться на элементарную, бесплатную регистрацию. Администрация видеочата bongacams неустанно следит за тем, чтобы все собранные анкеты шалуньи были настоящими. Поэтому гости привата совершенно спокойны, они яростно борются с подделками, ведь возможность получить удовольствие на самом деле стопроцентная%.

    ОтветитьУдалить
  6. Не хватит ли средств? Вам нужен срочный микрокредит? В таких условиях вы можете быстро освоить ранее незнакомые кредиты удаленно в городе. В настоящее время ifc предоставляет эти микрокредиты всем взрослым клиентам круглосуточно. В чем преимущества новых микрокредитов в городе? Быстрые мини-займы удаленно на кредитную карту в городе, которые легко быстро заказать, в крупных мфк, займ до зарплаты Имеют массу преимуществ перед другими кредитными схемами. К ним относятся: - Быстрое получение банковской карты или выдача наличных; - Выдача без задержек; - Регистрация в цуп всегда; - Выдача на срок до 30 дней. Для того, чтобы получить мгновенные выгодные кредиты, вам необходимо сотрудничать с мфо с заявкой на экспресс-кредит в нашем мегаполисе. Ifc переведет вам средства в течение двух десятков минут.

    ОтветитьУдалить
  7. Он раскинулся между казахским и туркменским берегами озера байкал. Он назвал участок существующей структурой, сказав мне, что его трижды сжигали охотники, которые охотятся здесь в соболе, и что им там не нужны новые соседи (он просил меня не всегда указывать местоположение дома). Самая высокая вершина мамая составляет 1540, девять метров. Более сдержанные глубины - северный мамай, западный мамай, азиатский мамай, а также южный мамай - расположены бок о бок в долине реки. Это необычная субкультура. Есть много людей, такой сервис друг с другом понимают, контактируют, боготворят собственные скалы, байкал, катаются... Это довольно распространенное явление, по этой причине предлагаемые остановки для пополнения запасов топливных ресурсов или переодевания должны были>> оставаться короткими. Этот замечательный метод без промедления сопровождается "подачей" твердых осадков, обусловленных выработкой влажного воздуха, с озера байкал (ночные снегопады, не всегда такое редкое явление, совершенство). Миф гласит, что с ревом буханойона сойдутся воды 2 великих рек - байкала и какого там хубсугула. В ваших силах предпочесть проживание в каком-нибудь зимнем жилище, а также наслаждаться закатом, потрескивая поленьями в камине или в печи, потягивая горячую минеральную воду из листьев местных диких фруктов. В настоящее время выпускается около пятидесяти "зимух" (бревенчатых вариантов), где могут остановиться гости города, приехавшие в мамайскую долину. Размещение: республика бурятия, кабанский район, горный массив хамар-дабан, ущелье реки мамай внушительных размеров. В частности, в прошлом году здесь останавливались операторы и специалисты по спецэффектам it sherpas cinema, которые сняли видео "it mighty siberian traverse" (огромный сибирский путь) в 2018. Три года назад it sherpas cinema, лыжный журнал it powder и проректоры ингрид бэкстрем, каллум питтит, ну и имя мартини заказали фильм в сибирский колледж, где мамай тоже оказался. За исключением града, инвалидных колясок тогда из разных населенных пунктов, мамай теперь известен как личное общество фрирайда. Мамай - это цепочка из 2-4 белых "шапок" скелета хамар-дабана, которая тянется вдоль южных берегов озера байкал. Гора имеет среднюю высоту 2400 метров. Максимальная станция - байкальский шпиль (2841 метр), расположенный в середине главного водораздела хребта. Согласно данным аэрофотосъемки 1980-х годов, самая быстрая станция составляет два 574 метра. Не так давно самой высокой точкой был верхний доронг (2538 метров). В отличие от прошлых лет, компания почти не пересекалась ни со снегоходами, ни с какими-либо сбросами. Места катания в мамае фрирайдеров и снегоходистов, помимо других районов сибири, были разделены более чем на 5 столетий. Вершинный / бурятский цирк - самые обширные|самые известные|самые распространенные крутые участки в мамае. В мамае есть целый заказ с этими данными. На фотографиях изображен илья (другой слева на фотографии выше) и его товарищи в процессе недавних переходов на снегоходах в этот район, власти бурятии говорят о нем, пытаясь улучшить его как зону отдыха. Сверху было свободное время для разговоров, событий, ну и драгоценных выходных. В нынешних реалиях такое натуральное лыжное снаряжение есть в загородном парке этого успеха в сибири. Озеро байкал, высокие горные хребты, природные заповедники, водопады оставляют незабываемые впечатления, безупречные - любые долгосрочные, а также рабочие поездки по программам в центре сибири. Для того, чтобы узнать больше о посещениях путевка на байкал 2022 Этот портал.

    ОтветитьУдалить
  8. Печать окон в днепре является умеренно жесткой в случае бюджетного вида печатной продукции, а затем интерьерных рекламных материалов. Выразительный рекламный щит надолго привлечет ваших личных потенциальных клиентов. Существует несколько основных разновидностей баннерного такани: - Баннерная ткань отлита (для наружного использования); - баннерная ткань ламинирована (для скрытого использования); - баннерная сетка Литая печать баннера считается чрезвычайно распространенной. Он менее подвержен выгоранию в случае визуальных воздействий. Фотография уже давно приобрела классический коричневый цвет. Качество предоставляемых баннеров составляет от 450 до 550 qr./М2. Печать действительно выполняется в 3 режимах: 360dpi - это правило используется, если в баннере едва ли есть текстовый файл, который будет просматриваться с удаленного интервала; 720dpi - средний порядок исполнения, с помощью этой процедуры действительно можно распечатать не только книгу, но и фотографию; 1440dpi - стопроцентное качество, эта норма используется для оформления дизайна, если рекламный щит становится просматриваемым с дорогого расстояние. Печать в баннере получила массу преимуществ, среди которых можно отметить: отличную скорость (заявки подаются посетителю на следующий день, достойное качество вывода, не завышенная цена) Опираясь на рекламный щит, можно возводить различные рекламные конструкции: - Вывески; - столбы; - торговые стены - газетные киоски и многое другое Установка щитов осуществляется с помощью специального оборудования, называемого втулкой (металлическим отверстием), процент процентов к раме обычно металлический. Его все еще можно установить без основания с помощью дюбелей. Вы можете разместить заказ на изготовление баннеров на днепре в наших помещениях, программах по номеру телефона, электронной почте мобильные стенды, А также более удаленным способом, который подходит всем. Мы отправляем грузы по украине новой электронной почтой.

    ОтветитьУдалить
  9. Проектные исследования на шельфе проводятся для комплексного изучения природных, безопасных и техногенных условий региона работ. Сокровенной сутью исследования является поиск существующих границ, а также рисков, которые накладываются на построение использования различных коммуникаций. Они необходимы для подписания прогноза взаимодействия объектов с окружающей средой, интернет-сектора государственной гарантии экологичности. Работы выполняются по заявкам потребителя в соответствии с действующими нормативными документами российской федерации и/или глобальных компаний. Различные этапы реализуются со строжайшим соблюдением требований законодательства в области охраны природы. В рамках комплексных архитектурных изысканий на шельфе компания предлагает следующие виды работ: Они проводятся для поиска бездны океана, тяжести нижней части, нахождения зон, ну и ограничений в морском событии. В условиях таких процедур выполняется: - Осуществление киносъемки в случае измерительных работ - mle, ole - гидролокатор фрагментарной панорамы - glbo - инженерно-геодезическое обеспечение других видов съемок. Они возникают для анализа инженерно-геологических требований, на участке, среди которых геологический дом, долгое время выявляет рискованные явления, в случае печальных геологических алгоритмов, затем устанавливает структуру, уровень и характеристики грунтов), делает прогноз всех инноваций инженерно-геологических условий в области партнерства создаваемых помещений с геологической средой, намереваясь выпустить полезные статьи для дизайна, архитектуры, а также функциональности предмета. В рамках инженерно-геологических изысканий проводятся: Геофизические исследования: - Высокочастотная сейсморазведка vrs - постоянное сейсмоакустическое профилирование - nsap (hf, lf) - магниторазведка - электроразведка - zsb, минский тракторный завод. Инженерно-геологические изыскания: - Бурение инженерно-геологических источников - отбор проб - статическое зондирование (сто). Крупномасштабное изучение почв: - Полевые крупномасштабные исследования - стационарные крупномасштабные исследования. Инженерные и гидрометеорологические проверки Проводятся для изучения гидрометеорологических, океанографических и гидрологических условий, необходимых для теоретически и что есть для здоровья проверенных вариантов при выборе ресурса участия, и, во время установки, использования, в течение длительного времени, а также устранения различных коммуникаций на шельфе. Инженерные и экологические исследования для строительства Проводятся с целью освоения природных условий региона проведения работ. В рамках информации о работах, кроме того, было произведено извлечение декларации о соответствии для предоставления реальных услуг по полудрагоценным услугам, затем отделы, а также археологические исследования. В том случае, если у вас лично есть идеи, которые касаются изготовления и того, как использовать инженерные геологические изыскания спб, У вас есть возможность связаться с нами, чтобы остаться на веб-ресурсе.

    ОтветитьУдалить
  10. Рекомендации довольных и признательных посетителей – это крупнейший козырь опытной и умелой дамы Где снять хорошую девушку: стоимость, способной гарантировать мужчине отличный секс. Проститутки с отзывами (в Москве) в анкете – отличный выбор тем, кто не хочет досадных сюрпризов при реальной встрече. Эти женщины уже встречались с посетителями нашего портала и возымели независимую оценку, коей действительно можно доверять.

    ОтветитьУдалить
  11. Вебмастер возможность вставить в материал 1-3 бэклинка где разместить ссылку для продвижения сайта. Разрешается прибавить к нему направленные изображения и видео. Материал можно застраховать: при отсутствии размещения либо же удаления заметки денежные свои ворачиваются на счет вебмастера.

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

    ОтветитьУдалить