Ошибка с точкой рисования на QLabel - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь нарисовать QLabel в Qt так:

paintscene.h:

class PaintScene : public QWidget
{
    Q_OBJECT
public:
    PaintScene(QWidget* parent = NULL);

    QVector<QLabel*> _layers;
    QColor _color;
    int _width;

    void mousePressEvent(QMouseEvent* event);

private slots:
    void updateWidth();
};

paintscene.cpp:

PaintScene::PaintScene(QWidget* parent) : QWidget(parent)
{
    _width = 10;
    _color = Qt::red;
    QLabel* inital = new QLabel(this);
    inital->setStyleSheet("QLabel { background-color : white; }");
    _layers.push_back(inital);

    QGridLayout* layout = new QGridLayout();
    layout->addWidget(inital, 1, 1, 1, 1);
    this->setLayout(layout);
}

void PaintScene::mousePressEvent(QMouseEvent *event)
{
    QImage tmp = _layers.back()->pixmap()->toImage();
    QPainter painter(&tmp);
    QPen paintpen(_color);
    paintpen.setWidth(_width);
    painter.setPen(paintpen);
    painter.drawPoint(event->x(), event->y());
    _layers.back()->setPixmap(QPixmap::fromImage(tmp));
}

Список необходим, потому что я хочу реализовать работу со слоями (QLabel - отдельный слой).

Однако я получаю сообщение об ошибке, программа завершается.Ошибка возникает на линии QImage tmp = _layers.back()->pixmap()->toImage();.

Что делает это возможным?Как это можно исправить?Может для слоя использовать что-то другое, а не QLabel?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

@ Джереми Фризнер прав насчет причины ошибки, поскольку QPixmap не имеет, это будет нулевым, в моем ответе я покажу возможное решение

void PaintScene::mousePressEvent(QMouseEvent *event)
{
    QLabel *label = _layers.back();
    const QPixmap *pix= label->pixmap();
    QPixmap pixmap;
    if(pix)
        pixmap =  *pix;
    else{
        pixmap = QPixmap(label->size());
        pixmap.fill(Qt::transparent);
    }
    QPainter painter(&pixmap);
    QPen paintpen(_color);
    paintpen.setWidth(_width);
    painter.setPen(paintpen);
    painter.drawPoint(event->pos());
    painter.end();
    label->setPixmap(pixmap);
}

enter image description here

0 голосов
/ 27 мая 2018

Из Qt docs для QLabel::pixmap():

This property holds the label's pixmap
If no pixmap has been set this will return 0.

... поэтому, когда вы делаете это:

QImage tmp = _layers.back()->pixmap()->toImage();

pixmap() возвращаетсяNULL (потому что на QLabel еще никогда не было установлено ни одного QPixmap), а затем вы пытаетесь разыменовать этот NULL-указатель для вызова toImage(), поэтому происходит сбой.

Чтобы избежать сбоя, непопробуйте создать QImage из NULL-указателя QPixmap.

Я подозреваю, что вы хотите вызывать grab() вместо pixmap() - grab() создаст для вас QPixmap, который содержит визуальный видQLabel.Тем не менее, еще лучшим подходом было бы вообще не связываться с QPixmaps;вместо этого создайте свой собственный подкласс класса QLabel и переопределите его метод paintEvent(QPaintEvent *), чтобы сначала вызвать до QLabel::paintEvent(e), а затем используйте QPainter, чтобы впоследствии нарисовать дополнительную точку.Это будет легче реализовать, а также будет более эффективным во время выполнения.

...