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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы