Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Tirex от Апрель 04, 2006, 18:44



Название: Использование QPixmap, QPicture как буфера
Отправлено: 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 и т.д.)


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 04, 2006, 18:53
ДьІк. ПиксельньІй буфер? Дак:

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


Аль я чёт недопонял...


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 04, 2006, 20:08
Чето я не поннял  :?
Можно поподробнее плиз.
если бы на WinApi я бы просто сделал бы Bitmap и копировал потом его на нужную область а тут не понимаю


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 05, 2006, 11:52
Уточни какая версия Qt.
Все методьІ рисования в Qt обьединеньІ в QPainter, которьІй одинаково рисует на QPaintDevice, то-есть на:

QWidget
QPixmap
QImage
QPicture
QPrinter
QGLPixelBuffer


Название: -
Отправлено: Tirex от Апрель 05, 2006, 12:47
QT 4.1.0 OpenSource.
В игре, игровое поле большую чать времени не меняется. Хочу его  просто копировать на основной widget ну допустим как image. Потом если какие то изменения, изменить на Image и снова ничего не трогать.
но ведь QImage нет методов для рисования.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 05, 2006, 13:08
QImage - физически тот же QPixmap с форматом QImage::Format_ARGB32_Premultiplied, где каждьІй компонент цвета преумножен на значение альфьІ (для скорости рисования). На QImage рисуется точно так же, как и на QPixmap с помощью QPainter.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 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);
   }
}


Ничего не происходит, на форме пусто.
Плиз можно пример.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 05, 2006, 16:19
GField является членом класса RenderArea? Не забьІли ли ВьІ установить ему размер?


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 05, 2006, 20:22
Цитата: "Dendy"
GField является членом класса RenderArea? Не забьІли ли ВьІ установить ему размер?

На первый вопрос: Да
на 2-й :) забыл. добавил в конструтор RenderArea
QPixmap GField(100,100);, все равно ничего .


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 06, 2006, 09:13
Убедись, что рисование происходит и в пиксмапу что-то пишется. Попробуй сохранить её содержимое в файл. Убедись, что пиксмапа рисуется на окне, для етого QWidget::update().

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


PNG - чтоб видно бьІло альфу.


Название: Использование QPixmap, QPicture как буфера
Отправлено: MaxWin от Апрель 07, 2006, 11:20
Я недавно сталкивался с таким приколом.
Глюк как мне кажется вот здесь.

QPainter painter(this);

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

В твоем случае, если виджет сложный может быть похожий глюк.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 07, 2006, 12:10
Никакой ето не глюк. QWidget - логический елемент, область для рисования и приёма собьІтий. Если на нём создано другое окно, то только его область рисования перекрьІвает родительское. Такая архитектура проста для понимания и использования. Просто в каждом конкретном случае нужно читать документацию.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 07, 2006, 12:35
в png рисунок есть
потом в
void RenderArea::paintEvent(QPaintEvent *event)
пишу так:
      painter.drawPixmap(1,1,100,100,GField);
и даже так:
      painter.drawPixmap(1,1,GField);

на экране пусто


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 07, 2006, 13:01
От чего порождён RenderArea?


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 07, 2006, 13:26
class RenderArea : public QWidget
{
    Q_OBJECT


Название: Использование QPixmap, QPicture как буфера
Отправлено: Dendy от Апрель 07, 2006, 15:46
Дружище, пакуй проект (только исходники и файл проекта) и сюдьІ: dendy-unico@bk.ru

Всё равно щаз нечем заняться, авось помогу.


Название: Использование QPixmap, QPicture как буфера
Отправлено: Tirex от Апрель 08, 2006, 05:19
нашел ошибку :), там я чуть напартачл
И еще вопрос. раз уж тема пошла
хочу сделать заливку фона текстурой
пишу так :

    QPixmap q = QPixmap("datas/f1.png");
    QBrush BGBrush( q );
    BGBrush.setTexture(q);

painter.setBrush(BGBrush);
painter.fillRect(event->rect(), BGBrush);
ничего не рисуется.