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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Использование QPixmap, QPicture как буфера  (Прочитано 14342 раз)
Tirex
Гость
« : Апрель 04, 2006, 18:44 »

Рисую на QWidget через QPainter
Код:

void RenderArea::paintEvent(QPaintEvent *event)

{
QPainter painter(this);
if (game.IsGame) {
painter.setRenderHint(QPainter::Antialiasing);
painter.fillRect(event->rect(), QBrush(Qt::cyan));
game.DrawField(GField);
}
}

хочу сделать временный буфер. Как реализовать? Не у QPixmap, QPicture нет функций для рисования (line,rect и т.д.)
Записан
Dendy
Гость
« Ответ #1 : Апрель 04, 2006, 18:53 »

ДьІк. ПиксельньІй буфер? Дак:

Код:
QPainter painter( &pixmap );
painter.drawLine( ... ); // draw some
painter.end();


Аль я чёт недопонял...
Записан
Tirex
Гость
« Ответ #2 : Апрель 04, 2006, 20:08 »

Чето я не поннял  :?
Можно поподробнее плиз.
если бы на WinApi я бы просто сделал бы Bitmap и копировал потом его на нужную область а тут не понимаю
Записан
Dendy
Гость
« Ответ #3 : Апрель 05, 2006, 11:52 »

Уточни какая версия Qt.
Все методьІ рисования в Qt обьединеньІ в QPainter, которьІй одинаково рисует на QPaintDevice, то-есть на:

QWidget
QPixmap
QImage
QPicture
QPrinter
QGLPixelBuffer
Записан
Tirex
Гость
-
« Ответ #4 : Апрель 05, 2006, 12:47 »

QT 4.1.0 OpenSource.
В игре, игровое поле большую чать времени не меняется. Хочу его  просто копировать на основной widget ну допустим как image. Потом если какие то изменения, изменить на Image и снова ничего не трогать.
но ведь QImage нет методов для рисования.
Записан
Dendy
Гость
« Ответ #5 : Апрель 05, 2006, 13:08 »

QImage - физически тот же QPixmap с форматом QImage::Format_ARGB32_Premultiplied, где каждьІй компонент цвета преумножен на значение альфьІ (для скорости рисования). На QImage рисуется точно так же, как и на QPixmap с помощью QPainter.
Записан
Tirex
Гость
« Ответ #6 : Апрель 05, 2006, 14:54 »

в  .h
   QPixmap GField;

в .cpp
void RenderArea::CreateCache()
{
    QPainter painter(&GField);
    game.DrawField(painter);
}
....
void game_engine_class::DrawField(QPainter& qp)
{
   for (int i=0;i<h ;i++)
      for (int j=0;j<w ;j++)
   ....
   game_box[i*w+j].DrawCircle(qp);
   ....
}
потом в основом цилке рисования:
void RenderArea::paintEvent(QPaintEvent *event)
{
   QPainter painter(this);
   if (game.IsGame) {
        painter.setRenderHint(QPainter::Antialiasing);
        painter.fillRect(event->rect(), QBrush(Qt::cyan));
      painter.drawPixmap(1,1,100,100,GField);
   }
}


Ничего не происходит, на форме пусто.
Плиз можно пример.
Записан
Dendy
Гость
« Ответ #7 : Апрель 05, 2006, 16:19 »

GField является членом класса RenderArea? Не забьІли ли ВьІ установить ему размер?
Записан
Tirex
Гость
« Ответ #8 : Апрель 05, 2006, 20:22 »

Цитата: "Dendy"
GField является членом класса RenderArea? Не забьІли ли ВьІ установить ему размер?

На первый вопрос: Да
на 2-й Улыбающийся забыл. добавил в конструтор RenderArea
QPixmap GField(100,100);, все равно ничего .
Записан
Dendy
Гость
« Ответ #9 : Апрель 06, 2006, 09:13 »

Убедись, что рисование происходит и в пиксмапу что-то пишется. Попробуй сохранить её содержимое в файл. Убедись, что пиксмапа рисуется на окне, для етого QWidget::update().

Код:
GField.toImage().save( "GField.png", "png" );


PNG - чтоб видно бьІло альфу.
Записан
MaxWin
Гость
« Ответ #10 : Апрель 07, 2006, 11:20 »

Я недавно сталкивался с таким приколом.
Глюк как мне кажется вот здесь.

QPainter painter(this);

Я наследовался от QScrollView. И при таком таком painter область рисования почему-то улетала под виджет.
Я делал вот так QPainter painter( viewport() );

В твоем случае, если виджет сложный может быть похожий глюк.
Записан
Dendy
Гость
« Ответ #11 : Апрель 07, 2006, 12:10 »

Никакой ето не глюк. QWidget - логический елемент, область для рисования и приёма собьІтий. Если на нём создано другое окно, то только его область рисования перекрьІвает родительское. Такая архитектура проста для понимания и использования. Просто в каждом конкретном случае нужно читать документацию.
Записан
Tirex
Гость
« Ответ #12 : Апрель 07, 2006, 12:35 »

в png рисунок есть
потом в
void RenderArea::paintEvent(QPaintEvent *event)
пишу так:
      painter.drawPixmap(1,1,100,100,GField);
и даже так:
      painter.drawPixmap(1,1,GField);

на экране пусто
Записан
Dendy
Гость
« Ответ #13 : Апрель 07, 2006, 13:01 »

От чего порождён RenderArea?
Записан
Tirex
Гость
« Ответ #14 : Апрель 07, 2006, 13:26 »

class RenderArea : public QWidget
{
    Q_OBJECT
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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