QLabel

时间:2018-05-27 04:37:08

标签: c++ qt qlabel

我正试图在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 :(得分:1)

来自QLabel::pixmap()的{​​{3}}:

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(),从而导致崩溃。 / p>

为避免崩溃,请勿尝试从NULL QPixmap指针创建QImage。

我怀疑您想要调用grab()而不是pixmap() - grab()会为您创建一个包含QLabel视觉外观的QPixmap。然而,更好的方法是避免弄乱QPixmaps;相反,创建自己的QLabel类的子类,并覆盖其paintEvent(QPaintEvent *)方法,首先调用QLabel::paintEvent(e),然后使用QPainter绘制附加点。这将更容易实现,并且在运行时也更有效。

答案 1 :(得分:1)

@Jeremy Friesner关于错误的原因是正确的,没有QPixmap这将是null,在我的回答中我将展示一个可能的解决方案

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