Russian Qt Forum
Ноябрь 25, 2024, 12:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT 4.2.2 Опять глупый вопрос. Теперь по QGraphicsItem  (Прочитано 10633 раз)
evilguard
Гость
« : Февраль 23, 2007, 00:32 »

Почему-то не отображаются наследованные элементы от QGraphicsItem:
Код:

//map.h

#include <QGraphicsItem>
#include <QPainter>

class Map : public QGraphicsRectItem
{

public:
Map(QImage img);
~Map();

void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget);

private:
QImage image;
};


Код:

#include <QStyleOptionGraphicsItem>

#include "map.h"

Map::Map(QImage img) : image(img)
{

}

Map::~Map()
{

}

void Map::paint(QPainter *painter,
 const QStyleOptionGraphicsItem *option,
 QWidget *widget)
{
painter->drawImage( option->exposedRect, image, option->exposedRect, Qt::OrderedAlphaDither );
}


Код:

#include "map.h"
...
canvas = new QGraphicsScene();
editor = new QGraphicsView(canvas, ui.centralwidget);
editor->setDragMode(QGraphicsView::RubberBandDrag);

ui.vboxLayout->addWidget(editor);
...
                 // Вот это работает
QAbstractGraphicsShapeItem* i = canvas->addEllipse(QRectF(0,0,50,50));
i->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
i->setPen(Qt::NoPen);
i->setBrush( QColor(qrand()%32*8,qrand()%32*8,qrand()%32*8) );
i->setPos(qrand()%int(canvas->width()), qrand()%int(canvas->height()));
i->setZValue(qrand()%256);

...

QString logo_fn = "qtlogo.png";
QImage logoimg;
logoimg.load(logo_fn);

                // А вот это нет
Map *map = new Map(logoimg);
map->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
map->setPen(Qt::NoPen);
map->setBrush( QColor(qrand()%32*8,qrand()%32*8,qrand()%32*8) );
map->setPos(qrand()%int(canvas->width()), qrand()%int(canvas->height()));
map->setZValue(qrand()%256);

canvas->addItem(map);


Не отображаются элементы типа Map, а стандатные нормально. В чем дело, вроде стандартно копи-пейстом все сделал..
Записан
QCasper
Гость
« Ответ #1 : Февраль 23, 2007, 04:04 »

может быть потому что вы забыли переопределить boundingRect()?
Записан
evilguard
Гость
« Ответ #2 : Февраль 23, 2007, 18:08 »

Все получилось, только если наследоваться от QGraphicsRectItem, объект нельзя двигать, если от просто QGraphicsItem, то можно.
Еще вопрос такой - собираюсь рисовать на QGraphicsItem, затем всю сцену буду печатать на принтере. Рисовать буду в системе координат пикселов. А для печати мне нужно знать всю геометрию в сантиметрах, чтобы точно определить размеры элементов на бумаге. Есть ли какое-нибудь средство для этого?

добавлено спустя 2 часа 4 минуты:

 почему-то когда рисую за пределами границ, заданных в boundingRect(), изображение не отсекается. Как-нибудь можно это сделать?

добавлено спустя 7 часов 25 минут:

 Пока работал с QGraphicsView появились вопросы:
Рисую QPainter'ом на QGraphicsItem достаточно большой и сложный объект, он постоянно перерисовывается(многие тысячи методов drawRect()), нет никакой возможности это дело ускорить?В принципе перерисовка нужна при zoom in или zoom out объекта, или каких-то существенных изменений, а при простом двигании его, или скроллинге окна заново перерисовывать необязательно. Как это можно исправить?

добавлено спустя 3 минуты:

 Ах да и еще вопрос:) Можно ли при рисовании фигур координаты задавать не пиксельно(то есть) целые значения, а точные значения. А то при zoom in изображения размеры сильно искажаются из-за округления. Чтобы получить что-то наподобие векторной графики.
Записан
evilguard
Гость
« Ответ #3 : Февраль 25, 2007, 21:45 »

Все-таки ответьте кто-нибудь на мои вопросы? Пожалуйста!
Записан
QCasper
Гость
« Ответ #4 : Февраль 25, 2007, 22:01 »

Цитата: "evilguard"


 Пока работал с QGraphicsView появились вопросы:
Рисую QPainter'ом на QGraphicsItem достаточно большой и сложный объект, он постоянно перерисовывается(многие тысячи методов drawRect()), нет никакой возможности это дело ускорить?В принципе перерисовка нужна при zoom in или zoom out объекта, или каких-то существенных изменений, а при простом двигании его, или скроллинге окна заново перерисовывать необязательно. Как это можно исправить?



Можно самому контролировать полную перерисовку - рисовать в определенный момент (когда требуется полная перерисовка) все это дело в пиксмап, а в методе paint только этот пиксмап отрисовывать
Записан
evilguard
Гость
« Ответ #5 : Февраль 26, 2007, 19:36 »

хорошо, только такой вопрос, допустим я 1 раз рисую в пиксмап, потом его постоянно буду выводить в QGraphicsItem. А если я применил для всего виджета QGraphicsView метод scale(), допустим приблизил, при масштабировании Пиксмапа все линии увеличат свою толщину, то есть не достигнется эффекта векторной графики, когда изображение приближаешь-отдаляешь, и кубики не появляются, как в растровой графике.
Записан
evilguard
Гость
« Ответ #6 : Февраль 27, 2007, 21:08 »

Появился вопрос.
Хочу сделать заливку в QGraphicsItem. Есть вариант рисовать полигоны, залитые каким-то цветом, просто проблема в том, что алгоритм отыскания этих полигонов с учетом моей задачи очень тяжелый. Поэтому хочу сделать заливку просто попиксельно. Все будет нормально, но вопрос в том, что если применять на весь QGraphicsView метод scale(), то пиксели, которые я буду рисовать увеличатся. В общем все сводится к предыдущему вопросу: можно ли как-то отловить zoom in/zoom out, и рисовать попиксельно, и еще желательно только в той области, которая отображается на экране?
Записан
evilguard
Гость
« Ответ #7 : Февраль 28, 2007, 18:28 »

up!
Записан
evilguard
Гость
« Ответ #8 : Март 04, 2007, 09:07 »

Проблема так и не решена. Если кэшировать изображение QGraphicsItem в Пиксмап, как быть при применении метода QGraphicsView::scale()? Чтобы изображение нормально перестроилось в новом масштабе.
Записан
evilguard
Гость
« Ответ #9 : Март 06, 2007, 09:20 »

поднимаю топик Улыбающийся надоело уже никто не отвечает Улыбающийся
Записан
evilguard
Гость
« Ответ #10 : Март 10, 2007, 18:49 »

Все-таки нашел то что мне нужно: свойство QGraphicsView::CacheMode
 view.setCacheMode(QGraphicsView::CacheBackground);
Но почему-то оно не работает, мой большой объект QGraphicsItem не кэшируется.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 21.