Задать вопрос
@Yapparov_Ilyas

Как рисовать на QPixmap?

Здравствуйте всем. Имеется класс, наследованный от QLabel. В него необходимо установить картинку из 2 QPixmap. Решил создать третий QPixmap и в paintEvent перерисовывать изображение
void MainWindow::paintEvent(QPaintEvent*)
{
    QPixmap *pixmap=new QPixmap(this->size().width(), this->size().height());
    QPainter *painter=new QPainter(pixmap);
    painter->drawPixmap(0, 0, this->size().width(), this->size().height(), QPixmap(":/rectB.png"));
    painter->drawPixmap(0, 0, this->size().width(), this->size().height(), QPixmap(":/CheckFF.png"));
    painter->end();
    delete painter;

    pix= *pixmap;    //pix- private поле класса
    setPixmap(pix);
    delete pixmap;
}

Но почему- то в виджете так ничего и не прорисовывается. Пытался переопределять resizeEvent, вставляя в него repaint() и update(), но ситуация та же.
  • Вопрос задан
  • 2307 просмотров
Подписаться 2 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Ваши ошибки.
1. QPixmap — сам по себе указатель совместного владения; если надо его ненадолго создать — делайте на стеке, никаких new!
1.1. Аналогично и QPainter, только он указатель единоличного владения. Кстати, это однажды сыграло с одной моей программой злую шутку, когда она выжрала всю память.
2. Зачем нужна генерация Pixmap’а в процедуре перерисовки формы? Если ваш потомок сам корректно рисует картинку — генерируйте её по событию «что-то изменилось».

Далее, если картинок может быть конечное, но достаточно большое число (например, тысячи), можно наладить кэш, где хранятся подготовленными, например, последние двадцать. Если картинок немного (до сотни), лучше при загрузке программы подготовить их все.
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Господи, что ж вы делаете-то.
pix= *pixmap;

Это что вообще? Зачем?
Решил создать третий QPixmap и в paintEvent перерисовывать изображение

Так вы хотите один раз QPixmap проставить лейблу или перерисовывать каждый раз самостоятельно? Если перерисовывать, то зачем же QPixmap создавать на куче и еще и переприсваивать его в поле?
Пытался переопределять resizeEvent, вставляя в него repaint() и update(), но ситуация та же.

Ресайз-то тут причём? Пытаетесь уже любой ценой задачу решить?)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы