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

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

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: Вывод графики  (Прочитано 28060 раз)
Alexu007
Гость
« Ответ #60 : Май 19, 2013, 10:58 »

Можно рисовать на QImage/QPixmap, а перерисовывать только нужный участок с помощью update.
Спасибо, но для меня это мало что говорит. Желателен рабочий пример.

Но, собсна, то что я хотел - я выяснил. На картинке и сетка и "вода" и "корабли" для морского боя. И клики мышкой обрабатываются - добавляется/пропадает палуба.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #61 : Май 19, 2013, 12:10 »

Разве это не кощунство загружать картинки при каждом вызове paintEvent?
По хорошему на момент вызова paintEvent все картинки уже должны быть в видеопамяти, чтобы рисовалось максимально быстро средствами видеокарты.
Записан
Alexu007
Гость
« Ответ #62 : Май 19, 2013, 12:52 »

Конечно кощунство. Но никто не подсказал же, как можно нарисовать картинку, а потом вызвать paintEvent только для изменений в картинке - чтобы максимально быстро. А у меня получилось рисовать только внутри paintEventа.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #63 : Май 19, 2013, 12:57 »

Самая простая оптимизация, которая сюда просится - загружать картинки один раз вне paintEvent.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Alexu007
Гость
« Ответ #64 : Май 19, 2013, 17:39 »

Самая простая оптимизация, которая сюда просится - загружать картинки один раз вне paintEvent.
1. Я так и не смог ничего нарисовать прямо на форме без paintEvent. Подскажите, как можно загрузить на форму картинку, поверх которой затем можно рисовать paintEventом?

2. Картинка обновляется не столь часто, только после хода - не чаще раза в несколько секунд. И обновляется  быстро - на глаз незаметно. Стоит ли городить огород для пустяковой программы?

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #65 : Май 19, 2013, 18:53 »

1. Я так и не смог ничего нарисовать прямо на форме без paintEvent. Подскажите, как можно загрузить на форму картинку, поверх которой затем можно рисовать paintEventом?

Код
C++ (Qt)
   QPainter p(this);
   QImage img("c:/temp/qwe.png");
 
Зачем Вы грузите картинку при каждом рисовании? Сделайте переменную (напр m_img) членом класса, загрузите один раз в конструкторе. И пользуйтесь при каждом рисовании. Вы настойчиво стучитесь в открытую дверь  Улыбающийся
Записан
Alexu007
Гость
« Ответ #66 : Май 19, 2013, 21:33 »

Я поместил рисунки в ресурс и загружаю уже оттуда. Это что-то меняет?

Ну, я объявил в классе в public две переменные: QImage img1, img2;
а как их в конструкторе загружать? Они же загружаются при объявлении: QImage img1(":/images/0.png");
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #67 : Май 19, 2013, 23:38 »

Я поместил рисунки в ресурс и загружаю уже оттуда. Это что-то меняет?

Ну, я объявил в классе в public две переменные: QImage img1, img2;
а как их в конструкторе загружать? Они же загружаются при объявлении: QImage img1(":/images/0.png");
Мда.
Код
C++ (Qt)
// somewhere in constructor...
img1 = QImage(":/images/0.png");
И можно (нужно?) их приватными сделать.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Alexu007
Гость
« Ответ #68 : Май 20, 2013, 07:29 »

Мда.
И можно (нужно?) их приватными сделать.
Сделал. Работает. Спасибо большое за конкретную помощь.

Остался последний штрих. Нарисовать на форме картинку игрового поля в конструкторе, а в ходе игры дорисовывать только изменения - чтобы раз за разом не перерисовывать всё поле. Подскажете?
« Последнее редактирование: Май 20, 2013, 07:44 от Alexu007 » Записан
lighting
Гость
« Ответ #69 : Май 20, 2013, 10:20 »

Остался последний штрих. Нарисовать на форме картинку игрового поля в конструкторе, а в ходе игры дорисовывать только изменения - чтобы раз за разом не перерисовывать всё поле. Подскажете?
Да подсказали-же уже несколько раз. Заведи еще один QImage game_map размером с игровое поле, заведи булеву переменную need_update, в своем слоте-обработчике нажатий рисуй необходимые изменения
Код
C++ (Qt)
QPainter p;
p.begin(game_map);
// ... draw changes here
p.end;
need_update = true;
 
а в paintEvent пишешь следующее:
Код
C++ (Qt)
QPainter p(this);
if (need_update)
{
  p.begin;
  p.drawImage(0,0, game_map);
  p.end;
  need_update = false;
}
 
Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


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