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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скролл и QGraphicsView  (Прочитано 5392 раз)
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......-----------------------------
      ......................................
}
 
« Последнее редактирование: Июнь 27, 2011, 13:21 от Пантер » Записан
Ubuntu_linux
Гость
« Ответ #1 : Июнь 30, 2011, 02:24 »

А зачем перерисовывать?
Записан
nike1987
Гость
« Ответ #2 : Июль 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);
   }
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июль 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);
   }
}
« Последнее редактирование: Июль 15, 2011, 12:42 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
nike1987
Гость
« Ответ #4 : Июль 15, 2011, 11:56 »

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

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июль 15, 2011, 12:40 »

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

Qt 5.11/4.8.7 (X11/Win)
nike1987
Гость
« Ответ #6 : Июль 20, 2011, 14:21 »

Цитировать
Хм, такой вопрос может задать только тот, кто совершенно не вник в суть QGraphics.
Само собой, иначе бы я вопросы не спрашивал.
Честно говоря возник вопрос с перемещением itemов во время скроллинга.При работе скроллинга заметно отчётливые моргания перерисовки itemов(в моём случае текста).Может кто сталкивался с похожей проблемой?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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