Russian Qt Forum
Июнь 17, 2024, 15:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Рисование в QGraphicScene  (Прочитано 22902 раз)
deaks
Гость
« : Март 09, 2011, 16:47 »

Всем привет!

Ребята, подскажите, что я делаю неправильно -

В конструкторе главного окна делаю так
1) Создаю сцену
Код
C++ (Qt)
   QGraphicsScene scene = new QGraphicsScene(this);
   scene.setSceneRect(-300, -300, 300, 300);
   scene.setItemIndexMethod(QGraphicsScene::NoIndex);
2) Добавляю к ней итемы, унаследованные от QGraphicsItem
Код
C++ (Qt)
   for (int i = 0; i < 3; ++i) {
       Target *target= new Target;
       scene.addItem(target);
   }
3) Подключаю сцену к представлению(QGraphicsView), созданному через дизайнер
Код
C++ (Qt)
   ui->grvMain->setScene(&scene);
 

Но в итоге ничего не отображается. Хотя итемы инициализируются начальными координатами
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 09, 2011, 16:56 »

Что такое Target?
Записан

Qt 5.11/4.8.7 (X11/Win)
deaks
Гость
« Ответ #2 : Март 09, 2011, 17:00 »

класс унаследованный от QGraphicsItem. Пока реализует только рисование объекта.
Записан
Kolobok
Гость
« Ответ #3 : Март 09, 2011, 17:02 »

Оно и компилироваться не должно.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 09, 2011, 17:02 »

Цитата: deaks
класс унаследованный от QGraphicsItem. Пока реализует только рисование объекта.
Ну и как мы догадаемся как он это рисование реализует и какие ещё методы базового были перегружены?
Код давай.
« Последнее редактирование: Март 09, 2011, 17:06 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
deaks
Гость
« Ответ #5 : Март 09, 2011, 17:07 »

Все рисуется в переопределенном методе QGraphicsView::paint()
 
Код
C++ (Qt)
  painter->setBrush(color);
   painter->drawEllipse(-20, -20, 20, 20);
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Март 09, 2011, 17:10 »

Показывай boundingRect() и чем не устроил QGraphicsEllipseItem?
Записан

Qt 5.11/4.8.7 (X11/Win)
deaks
Гость
« Ответ #7 : Март 09, 2011, 17:15 »

Код
C++ (Qt)
QRectF Target::boundingRect() const
{
   qreal adjust = 0.5;
   return QRectF(-18 - adjust, -22 - adjust,
                 36 + adjust, 60 + adjust);
}

Я только для пример привел рисование эллипса. В дальнейшем в этом итеме будут гораздо сложные объекты
Записан
deaks
Гость
« Ответ #8 : Март 09, 2011, 18:20 »

решил залить фоном QGraphicsView
Код
C++ (Qt)
   ui->grvMain->setBackgroundBrush(QPixmap(":/img/map.jpg"));
 
но результат нулевой. ничего не изменилось. как это понимать?)
Записан
meego_man
Гость
« Ответ #9 : Март 09, 2011, 18:45 »

стандартные items не пробовали добавить, просто чтобы определить подключена ли сцена к view или нет?
Записан
deaks
Гость
« Ответ #10 : Март 09, 2011, 18:51 »

пробовал, не рисуется. я как раз и подозревал, что сцена не подключена к виду, для этого выложил ход моих действий=)
Записан
deaks
Гость
« Ответ #11 : Март 09, 2011, 19:25 »

ребят, подскажите пожалуйста) совсем не пойму где мог накосячить. делал как написано в ассистанте:
создал объект сцену, создал итем, добавил к сцене, добавил сцену к вью.
Записан
alexman
Гость
« Ответ #12 : Март 09, 2011, 19:59 »

Попробуй вызвать void QGraphicsView::fitInView ( const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio ) с нужными параметрами.
Записан
merke
Гость
« Ответ #13 : Март 10, 2011, 11:12 »

Код:
 QGraphicsScene scene = new QGraphicsScene(this);
замени на
Код:
 QGraphicsScene *scene = new QGraphicsScene(this);

Пример рисования эллипса:
Код
C++ (Qt)
   QGraphicsEllipseItem *pkrug = new QGraphicsEllipseItem(0, scene);
 
   pkrug->setPen(QPen(Qt::black));
   pkrug->setBrush(QBrush(Qt::yellow));
   pkrug->setRect(QRectF(-30,-30,120,80));
   pkrug->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Март 10, 2011, 12:58 »

Вот работающий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
 
class CircleItem : public QGraphicsItem
{
public:
CircleItem( qreal radius, QGraphicsItem* parent = 0 )
: QGraphicsItem( parent )
, radius_( radius ) {}
virtual ~CircleItem() {}
void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0 )
{
painter->drawEllipse( QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ ) );
}
QRectF boundingRect() const
{
return QRectF( -radius_ / 2, -radius_ / 2, radius_, radius_ );
}
public:
qreal radius_;
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
QGraphicsView gv;
QGraphicsScene scene( -150, -150, 300, 300 );
 
gv.setScene( &scene );
gv.setRenderHint( QPainter::Antialiasing );
 
for( qreal r = 20; r < 300; r += 10 )
scene.addItem( new CircleItem( r ) );
 
gv.show();
return app.exec();
}
 

И похоже, все проблемы из-за
Код
C++ (Qt)
scene.setSceneRect( -300, -300, 300, 300 );
Из-за смещения сцены на её размеры, получается вся отрисовка делается за пределами вьюпорта.
« Последнее редактирование: Март 10, 2011, 13:00 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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