crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> [РЕШЕНО] Отрисовка QPainter'ом на QPixmap'e
Andrewshkovskii
  опции профиля:
сообщение 7.12.2009, 17:19
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Хочу нарисовать сеточку на пиксмапе, вот такой вот код :

    ui->setupUi(this);
    //создаем объекты
    etalonSymbolPixmap = new QPixmap(ui->etalonSymbol->size());
    etalonPixelsNetPixmap = new QPixmap(ui->etalonPixelsNet->size());
    inputSymbolPixmap = new QPixmap(ui->inputSymbolFiled->size());
    inputPixelsNetPixmap = new QPixmap(ui->inputSymbolPixelsNet->size());
    painter = new QPainter();
    //заливаем их белым цветом.
    this->clearPixmaps();//для всех пиксмапов вызывается fill()
    //вставляем их в интерфейс..
    ui->etalonSymbol->setPixmap(*etalonSymbolPixmap);
    ui->etalonPixelsNet->setPixmap(*etalonPixelsNetPixmap);
    ui->inputSymbolFiled->setPixmap(*inputSymbolPixmap);
    ui->inputSymbolPixelsNet->setPixmap(*inputPixelsNetPixmap);
    QPainter painter(etalonPixelsNetPixmap);
    painter.setBrush(*(new QBrush(Qt::white,Qt::CrossPattern)));
    painter.drawRect(etalonPixelsNetPixmap->rect());//пытаемся нарисовать сетку..
    this->setFixedSize(865,502);

Ну и получается ровно ничего. какой-то косят с утсновкой PaintDevice в конструкторе painter'а ?

Сообщение отредактировал Andrewshkovskii - 7.12.2009, 18:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 17:32
Сообщение #2


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Andrewshkovskii @ 7.12.2009, 17:19) *
Хочу нарисовать сеточку на пиксмапе, вот такой вот код :

    painter.setBrush(*(new QBrush(Qt::white,Qt::CrossPattern)));


А ты суров :lol:

painter = new QPainter();
...
QPainter painter(etalonPixelsNetPixmap);


За раз можно использовать только один QPainter. Нарисовал - закрыл/уничтожил, создал новый и нарисовал что-то еще - закрыл/уничтожил.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 7.12.2009, 17:35
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Ну просто лень было объявлять выше, пусть с кучи тащит...:)
Закрывать через end()?
В прочем, всеравно не чиркает :

recognizer::recognizer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::recognizer)
{
    ui->setupUi(this);
    //создаем объекты
    etalonSymbolPixmap = new QPixmap(ui->etalonSymbol->size());
    etalonPixelsNetPixmap = new QPixmap(ui->etalonPixelsNet->size());
    inputSymbolPixmap = new QPixmap(ui->inputSymbolFiled->size());
    inputPixelsNetPixmap = new QPixmap(ui->inputSymbolPixelsNet->size());
    //заливаем их белым цветом.
    this->clearPixmaps();
    //вставляем их в интерфейс..
    ui->etalonSymbol->setPixmap(*etalonSymbolPixmap);
    ui->etalonPixelsNet->setPixmap(*etalonPixelsNetPixmap);
    ui->inputSymbolFiled->setPixmap(*inputSymbolPixmap);
    ui->inputSymbolPixelsNet->setPixmap(*inputPixelsNetPixmap);
    QPainter painter(inputPixelsNetPixmap);
    painter.setBrush(*(new QBrush(Qt::black,Qt::CrossPattern)));
    painter.drawRect(inputPixelsNetPixmap->rect());
    painter.end();
    this->setFixedSize(865,502);
}

Может потому что, после конструктора вызывается paintEvent, и стираем все мои старанья? :(

Сообщение отредактировал Andrewshkovskii - 7.12.2009, 17:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 17:46
Сообщение #4


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Andrewshkovskii @ 7.12.2009, 17:35) *
Может потому что, после конструктора вызывается paintEvent, и стираем все мои старанья?


Только в том случае, если ты переопределил paintEvent и там стираешь сам. Смотри чего в консоль пишется (CONFIG += console в .pro файл добавить надо)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.12.2009, 17:46
Сообщение #5


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

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

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




Репутация:   94  


Andrewshkovskii, рисовать можно только в paintEvent, в Асистенте же написано
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 7.12.2009, 17:55
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Цитата(SABROG @ 7.12.2009, 17:46) *
Цитата(Andrewshkovskii @ 7.12.2009, 17:35) *
Может потому что, после конструктора вызывается paintEvent, и стираем все мои старанья?


Только в том случае, если ты переопределил paintEvent и там стираешь сам. Смотри чего в консоль пишется (CONFIG += console в .pro файл добавить надо)

Я в криэйтере пишу, там все сообщения и так валяться в консоль вывода...

Цитата
Andrewshkovskii, рисовать можно только в paintEvent, в Асистенте же написано

Переписали.. результат =0 :/ я не понимаю, может он не может на девайсе пиксмапа рисовать?
void recognizer::paintEvent(QPaintEvent *)
{
    QPainter painter(inputPixelsNetPixmap);
    painter.setBrush(*(new QBrush(Qt::white,Qt::CrossPattern)));
    painter.drawRect(inputPixelsNetPixmap->rect());
    painter.end();
}

Из конструктора убрал this->clearPixmaps();...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 18:01
Сообщение #7


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 7.12.2009, 17:46) *
рисовать можно только в paintEvent, в Асистенте же написано


Так это только если QPaintDevice - QWidget. У меня как-то были проблемы с отрисовкой на QPixmap и тогда все рисовалось нормально на QImage, но потом у меня получилось рисовать и на QPixmap, не знаю что тогда изменилось.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 7.12.2009, 18:05
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Цитата(SABROG @ 7.12.2009, 18:01) *
Цитата(Litkevich Yuriy @ 7.12.2009, 17:46) *
рисовать можно только в paintEvent, в Асистенте же написано


Так это только если QPaintDevice - QWidget. У меня как-то были проблемы с отрисовкой на QPixmap и тогда все рисовалось нормально на QImage, но потом у меня получилось рисовать и на QPixmap, не знаю что тогда изменилось.

Сейчас попробую потанцевать с QImage, нарисовать на нем, а потом уж "вставить" его в пиксмап..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 18:09
Сообщение #9


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Всё, память ко мне вернулась.

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtGui/QPainter>
#include <QtGui/QPixmap>
#include <QtGui/QApplication>

int main( int argc, char *argv[] )
{
    QApplication app(argc, argv);
#if 1
    QPixmap pix( 100, 100 );
#else
    QPixmap pix;
#endif
    QPainter p( &pix );
    p.fillRect( QRect( 0, 0, pix.size().width(), pix.size().height() ), QBrush( Qt::white ) );
    p.setPen( QPen( Qt::red ) );
    p.drawRect( 10, 10, 80, 80 );
    pix.save( "test.png" );
    return 0;
}


Если точный размер картинки не выставлять, то получишь такое в консоли:

QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active


Вот здесь косяк скорее всего:

inputPixelsNetPixmap = new QPixmap(ui->inputSymbolPixelsNet->size());


В конструкторе главного окна виджеты еще не инициализированы и их размер может быть нулевым. Тебе нужно поймать момент, когда все окна уже отображаются и работает главный цикл. Сделать это можно через QTimer::singleShot(). Ну или жестко задать начальные размеры.

Сообщение отредактировал SABROG - 7.12.2009, 18:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 7.12.2009, 18:17
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Спасибо.. решено вот так :

recognizer::recognizer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::recognizer)
{
    ui->setupUi(this);
    //создаем объекты
    etalonSymbolPixmap = new QPixmap(ui->etalonSymbol->size());
    etalonPixelsNetPixmap = new QPixmap(ui->etalonPixelsNet->size());
    inputSymbolPixmap = new QPixmap(ui->inputSymbolFiled->size());
    inputPixelsNetPixmap = new QPixmap(ui->inputSymbolPixelsNet->size());
    //заливаем их белым цветом.
    this->clearPixmaps();
    //вставляем их в интерфейс..
    ui->etalonSymbol->setPixmap(*etalonSymbolPixmap);
    ui->etalonPixelsNet->setPixmap(*etalonPixelsNetPixmap);
    ui->inputSymbolFiled->setPixmap(*inputSymbolPixmap);
    ui->inputSymbolPixelsNet->setPixmap(*inputPixelsNetPixmap);
    this->setFixedSize(865,502);
}
void recognizer::clearPixmaps()
{
    inputSymbolPixmap->fill();
    etalonSymbolPixmap->fill();
    etalonPixelsNetPixmap->fill();
    inputPixelsNetPixmap->fill();
    QPainter p(etalonPixelsNetPixmap);
    p.fillRect(etalonPixelsNetPixmap->rect(),QBrush(Qt::CrossPattern));
    p.end();
    p.begin(inputPixelsNetPixmap);
    p.fillRect(inputPixelsNetPixmap->rect(),QBrush(Qt::CrossPattern));
    p.end();
}

}

Размеру жестко заданы в ui-шке..

Сообщение отредактировал Andrewshkovskii - 7.12.2009, 18:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.12.2024, 20:47