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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: перерисовать сетку изображений[РЕШЕНО]  (Прочитано 4905 раз)
Zeka13
Гость
« : Апрель 23, 2012, 17:58 »

Доброго времени суток.

Всё дело происходит на QGraphicsScene

Никак не могу сообразить как поступить, есть массив объектов, заполняю его QPixmap''ами и кидаю на сцену, затем эту сцену отображаю.

Хочу чтоб через время(использую таймер) все Pixmap''ы удалились и появились новые

Как-то так:
цикл заполнения --> увидеть сетку
таймер
цикл удаления старого заполнения + новое заполнения --> увидеть новую сетку


собственно проблемы с последним пунктом, не знаю как реализовать, в коде есть комментарии

вот часть кода, мини проект во вложении

Заранее огромное спасибо за любую помощь!

http://paste.ubuntu.com/942605/
« Последнее редактирование: Апрель 24, 2012, 21:23 от Zeka13 » Записан
V1KT0P
Гость
« Ответ #1 : Апрель 23, 2012, 19:08 »

Доброго времени суток.

Всё дело происходит на QGraphicsScene

Никак не могу сообразить как поступить, есть массив объектов, заполняю его QPixmap''ами и кидаю на сцену, затем эту сцену отображаю.

Хочу чтоб через время(использую таймер) все Pixmap''ы удалились и появились новые

Как-то так:
цикл заполнения
таймер
цикл удаления старого заполнения + новое заполнения


собственно проблемы с последним пунктом, не знаю как реализовать, в коде есть комментарии

вот часть кода, мини проект во вложении

Заранее огромное спасибо за любую помощь!

http://paste.ubuntu.com/942605/
У тебя там одна утечка:
Код
C++ (Qt)
for(int i=0;i<xSize;i++)
for(int j=0;j<ySize;j++)
{
pPixmapItem[i][j] = new QGraphicsPixmapItem();
if(i % supernumber == 0) //a[i][j]=0
pPixmapItem[i][j] = scene->addPixmap(QPixmap(strMinus));
else
pPixmapItem[i][j] = scene->addPixmap(QPixmap(strPlus));
}
 
Вот это лишнее: "new QGraphicsPixmapItem()". Ибо addPixmap сам выделяет память под новый объект.
Я не уверен что тебе надо постоянно удалять и создавать новые объекты, поэтому я разместил там две кнопки. По нажатию на первую все пиксмапы удаляются и создаются новые, а вторая кнопка просто меняет пиксмапы у готовых объектов. А спинбокс это твой supernumber.
Записан
Zeka13
Гость
« Ответ #2 : Апрель 23, 2012, 19:54 »

спасибо огромное

вот только у меня остаётся вопрос, как без нажатия кнопки вызвать любой из ваших слотов, прямо из кода, в каком месте сделать вызов?

у меня просто сеточка будет после расчётов в коде меняться, кнопками совсем не устраивает...
Записан
V1KT0P
Гость
« Ответ #3 : Апрель 23, 2012, 20:03 »

спасибо огромное

вот только у меня остаётся вопрос, как без нажатия кнопки вызвать любой из ваших слотов, прямо из кода, в каком месте сделать вызов?

у меня просто сеточка будет после расчётов в коде меняться, кнопками совсем не устраивает...
Как только надо изменить изображения так сразу вызывайте нужную функцию.
Записан
Zeka13
Гость
« Ответ #4 : Апрель 23, 2012, 20:11 »

Ну вот мне надо чтоб первый вариант отрисовался, потом сработал таймер и выполнилось on_deleteAndAddNew_clicked()

что-то типо того, но тут получается зацикливание

Код
C++ (Qt)
void Grid::fitScene()
{
   QSize view_size = ui->graphicsView->size();
   int margin = 1;
   QPointF pos = QPointF(margin, margin);
   QSizeF size = QSizeF(view_size.width()-margin*2, view_size.height()-margin*2);
 
   scene->setSceneRect(pos.x(), pos.y(), size.width(), size.height());
 
   if (size.width()<=size.height())
imageSize=(size.width())/GridSize;
   else
imageSize=(size.height())/GridSize;
 
   qreal scaleK;
   scaleK = (qreal)imageSize/imageSizeOld;
 
   for(int i=0;i<xSize;i++)
for(int j=0;j<ySize;j++)
{
pPixmapItem[i][j]->setPos(i*(imageSize),j*(imageSize));
pPixmapItem[i][j]->setScale(scaleK);
}
 
   on_deleteAndAddNew_clicked();
}
 
void Grid::on_deleteAndAddNew_clicked()
{
   //задержка перед перерисовкой
   QEventLoop loop;
   QTimer::singleShot(2000, &loop, SLOT(quit()));
   loop.exec();
 
   int supernumber = 3;
   for(int i=0;i<xSize;i++)
       for(int j=0;j<ySize;j++)
       {
           scene->removeItem(pPixmapItem[i][j]);
           if(i % supernumber == 0) //a[i][j]=0
               pPixmapItem[i][j] = scene->addPixmap(QPixmap(strMinus));
           else
               pPixmapItem[i][j] = scene->addPixmap(QPixmap(strPlus));
       }
  fitScene();
}
Записан
Bepec
Гость
« Ответ #5 : Апрель 23, 2012, 20:16 »

Стражи форева. В виде булевских флагов.
Записан
Zeka13
Гость
« Ответ #6 : Апрель 23, 2012, 20:19 »

я вас не понял, да и не только в зацикливание мне кажется дело
Записан
Bepec
Гость
« Ответ #7 : Апрель 23, 2012, 20:20 »

Моя реплика относилась только к зацикливанию - стражи, в виде булевских переменных "рисовать" и "рисовать = false" избавят тебя от рекурсии.
Записан
Zeka13
Гость
« Ответ #8 : Апрель 23, 2012, 20:28 »

да даже если я закоменчу этот fitScene не происходит то, что мне нужно

я хочу увидеть первую сетку, ничего не нажимать и увидеть вторую, например результат on_deleteAndAddNew_clicked()

а куда бы я не вставил вызов этого метода, я вижу только вторую сетку(которую сформировал on_deleteAndAddNew_clicked())

сейчас происходит вот так вот

цикл заполнения
таймер
цикл удаления старого заполнения + новое заполнения


либо
цикл заполнения --> увидеть сетку
нажать кнопку
цикл удаления старого заполнения + новое заполнения --> увидеть новую сетку


а мне надо

цикл заполнения --> увидеть сетку
таймер
цикл удаления старого заполнения + новое заполнения --> увидеть новую сетку
« Последнее редактирование: Апрель 23, 2012, 20:36 от Zeka13 » Записан
Zeka13
Гость
« Ответ #9 : Апрель 24, 2012, 21:23 »

сделал так

Код
C++ (Qt)
QTimer *timer = new QTimer(this); //создание объекта типа QTimer
drawGrid(); //первая прорисовка сетки
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(on_deleteAndAddNew_clicked()));
timer->start(2000); // пускаем таймер

ещё раз спасибо всем за внимание!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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