Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: nike1987 от Июнь 27, 2011, 13:20



Название: Скролл и QGraphicsView
Отправлено: nike1987 от Июнь 27, 2011, 13:20
Всем привет.
Имеется программка написанная с использованием шаблона MainWindow и QGraphicsView/QGraphicsScene.
Мне необходимо сделать перерисовку itemов при скроллинге. Возможно ли каким-нить образом "ловить" скролл через QMainWindow или нужно унаследоваться от QGraphicsView и переопределять метод paintEvent? Или может есть ещё каки-нить варианты?
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
 
   //-------------------Scene create---------------------------
   scene = new QGraphicsScene((this));
   scene->setSceneRect(QRectF(0, 0, 6400, 6400));
   view = new QGraphicsView(scene);
   view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
   EllipseCraft = new QGraphicsEllipseItem(0,0,5,5);
 
   //------------------Drawing......-----------------------------
      ......................................
}
 


Название: Re: Скролл и QGraphicsView
Отправлено: Ubuntu_linux от Июнь 30, 2011, 02:24
А зачем перерисовывать?


Название: Re: Скролл и QGraphicsView
Отправлено: nike1987 от Июль 14, 2011, 16:16
Задача такая, необходимо чтобы по краям рисовались координаты сетки.
Попробовал унаследоваться от QGraphicsView и переопределить метод paintEvent, но почему-то получаю белый экран, если делаю аналогичную рисовку в конструткоре унаследованного класса, то всё нормально рисуется.Не могу понять в чё может быть проблема??

Код
C++ (Qt)
 
PlaneViewer::PlaneViewer(QGraphicsScene *scene, QWidget *parent)
   : QGraphicsView(scene, parent)
{
   m_scene = scene;
   gridKf = 256;
}
void PlaneViewer::paintEvent(QPaintEvent *event)
{
   for(int i = 0; i < 6400; i+=gridKf)
   {
       QGraphicsLineItem *LineV = m_scene->addLine(i, 0, i, 6400);
       QGraphicsLineItem *LineH = m_scene->addLine(0, i, 6400, i);
   }
}
 


Название: Re: Скролл и QGraphicsView
Отправлено: GreatSnake от Июль 15, 2011, 11:14
Код
C++ (Qt)
void PlaneViewer::paintEvent(QPaintEvent *event)
{
    for(int i = 0; i < 6400; i+=gridKf)
    {
       QGraphicsLineItem *LineV = m_scene->addLine(i, 0, i, 6400);
       QGraphicsLineItem *LineH = m_scene->addLine(0, i, 6400, i);
    }
}
Мде, при каждой отрисовке будет создано 6400/256*2 QGraphicsLineItem's.  ???

Цитировать
Задача такая, необходимо чтобы по краям рисовались координаты сетки.
Судя по коду сетка рисуется никак не по краям)
Для координатной сетки нужно перегружать
для отрисовки под элементами:
Код
C++ (Qt)
virtual void QGraphicsView::drawBackground ( QPainter * painter, const QRectF & rect )
для отрисовки поверх элементов:
Код
C++ (Qt)
virtual void QGraphicsView::drawForeground ( QPainter * painter, const QRectF & rect )
{
   for(int i = 0; i < scene()->width(); i+=gridKf)
   {
       painter->drawLine(i, 0, i, scene()->height());
       painter->drawLine(0, i, scene()->width(), i);
   }
}


Название: Re: Скролл и QGraphicsView
Отправлено: nike1987 от Июль 15, 2011, 11:56
Цитировать
Судя по коду сетка рисуется никак не по краям)
Для координатной сетки нужно перегружать
для отрисовки поверх всех элементов:
Сама сетка у меня рисуется на всю сцену, а координаты сетки по краям вьювера должны рисоваться.В данном случае у меня простейший пример рисований линий, который почему-то не рисуется при переопределении paintEvent.
Цитировать
Мде, при каждой отрисовке будет создано 6400/256*2 QGraphicsLineItem's.
Прост мне необходимо чтобы при масштабировании сетка менялась, т.е. при увеличении масштаба частота сетки увеличивалась, а при уменьшении масштаба соотвественно уменьшалось.
А по поводу drawBackground и drawForeground в чём их преимущество перед paintEvent?


Название: Re: Скролл и QGraphicsView
Отправлено: GreatSnake от Июль 15, 2011, 12:40
Цитата: nike1987
А по поводу drawBackground и drawForeground в чём их преимущество перед paintEvent?
Хм, такой вопрос может задать только тот, кто совершенно не вник в суть QGraphics.
Откуда вам пришла такая "умная" мысль, что стоит перегружать QGraphicsView::paintEvent()  ???
Ведь именно в нём делается отрисовка элементов сцены. Причём в таком порядке:
drawBackground()
drawItems()
drawForeground()


Название: Re: Скролл и QGraphicsView
Отправлено: nike1987 от Июль 20, 2011, 14:21
Цитировать
Хм, такой вопрос может задать только тот, кто совершенно не вник в суть QGraphics.
Само собой, иначе бы я вопросы не спрашивал.
Честно говоря возник вопрос с перемещением itemов во время скроллинга.При работе скроллинга заметно отчётливые моргания перерисовки itemов(в моём случае текста).Может кто сталкивался с похожей проблемой?