crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сигнал changed в QGraphicsScene
skaz54
  опции профиля:
сообщение 8.12.2013, 19:57
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 15.3.2011
Пользователь №: 2503

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте.
Имеется сцена. На ней расположены QGraphicsItem'ы. Отрисовка сцены выполняется в PaintEvent(QPaintEvent * event).
Если установить соединение с сигналом QGraphicsScene->changed(const QList<QRectF> & region), то при удалении со сцены QGraphicsItem выполняется отрисовка всей видимой части сцены - значение области рисования передается в PaintEvent в параметре event->rect(). А в слот, который соединен с сигналом приходит один прямоугольник размером со сцену.
Если убрать соединение с сигналом QGraphicsScene->changed, то в PaintEvent приходит размер обновления области сцены, равный размеру удаляемого QGraphicsItem'а.
Причем, при добавлении QGraphicsItem'а на сцену при соединенном сигнале, обновление выполняется для области QGraphicsItem'а с соединенным сигналом или нет.

Можно ли как-нибудь сделать, чтобы и при удалении QGraphicsItem'а с установленным сигналом, обновлялась только область сцены под QGraphicsItem'ом ?
Возможно, надо установить какие-нибудь параметры для сцены?

В качестве образца проблемы взят пример из OT - examples\graphicsview\diagramscene.
Добавлен код в diagramscene.cpp:
DiagramView::DiagramView(QWidget *parent): QGraphicsView(parent)
{ };
void DiagramView::paintEvent(QPaintEvent * event)
{
QRect rect1 = event->rect();
qDebug() << "paintEvent" << rect1;
QGraphicsView::paintEvent(event);
}
Добавлен код в diagramscene.h:
class DiagramView : public QGraphicsView
{
Q_OBJECT
public:
DiagramView(QWidget *parent = 0);
private:
void paintEvent(QPaintEvent * event);
};

Добавлен код в mainwindow.cpp в функцию MainWindow::MainWindow():
view = new DiagramView(this);
view->setScene(scene);
connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(changeScene(QList<QRectF>)));

и
void MainWindow::changeScene(QList<QRectF> rects)
{ qDebug() << "" << rects; }

и соответственно в mainwindow.h

Проблема в строке
connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(changeScene(QList<QRectF>)));

QT 4.7

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.12.2013, 9:45
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


больше на баг смахивает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.12.2013, 17:09
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


>>Можно ли как-нибудь сделать, чтобы и при удалении QGraphicsItem'а с установленным сигналом, обновлялась только область сцены под QGraphicsItem'ом ?

может быть, как-то и можно. А вот точно нужно ? :) Отчего такое требование возникло ?

Попробуй также сначала hide() элемент, затем update() сцену, только потом удалить

Сообщение отредактировал Алексей1153 - 10.12.2013, 17:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.12.2013, 21:37
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей1153 @ 10.12.2013, 19:09) *
Отчего такое требование возникло ?
это очевидно - сцена может содержать гигнтское кол-во элементов, соответственно обновление займёт много времени
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alexei-evil
  опции профиля:
сообщение 14.1.2014, 11:42
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 10.1.2012
Пользователь №: 3114

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(skaz54 @ 8.12.2013, 20:57) *
Проблема в строке
connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(changeScene(QList<QRectF>)));


Зачем тебе вообще эта строка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 16:06