Michael Vincent
Michael Vincent

Reputation: 1660

Overriding QLabel to be able to draw graphs

I want to draw a graph on my main form, so I figured I'd use a QLabel and Override that. Like this:

// drawlabel.h
class DrawLabel : public QLabel
{
    Q_OBJECT
    public:
        DrawLabel(QWidget *parent = 0);
    private:
        void paintEvent(QPaintEvent *);
};

// drawlabel.cpp
DrawLabel::DrawLabel(QWidget *parent)
    : QLabel(parent)
{
}

void DrawLabel::paintEvent(QPaintEvent *)
{
    qDebug() << "paint event" ;

    QPainter painter(this);
    painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine));

    painter.setBrush(QBrush(QColor(255,255,255,120)));

    QRect selectionRect(10, 10, 100, 101);

    painter.drawRect(selectionRect);
}

On my main window I droppde a QLabel, sized it to about 500x200 and promoted it to DrawLLabel. When the application is run, a dashed square is drawn on the form.

All good so far.

If I add the line: this->setText("123456");

into the DrawLabel constructor, or add it into the paintEvent() I don't see the text. I'd also like to be able to have a border around the DrawLabel, but

this->setFrameShape(QFrame::Box);

in the constructor doesn't work either.

What should I be doing to get these to work?

Upvotes: 0

Views: 1164

Answers (2)

dtech
dtech

Reputation: 49329

If you want something custom, then implement a custom widget inheriting QWidget. Then you get to draw whatever you want and have whatever members you want.

Your problem is you have overridden the label's paint event, so the code to draw the label text is not executed.

You could call the method from QLabel as Evgeny suggested, but it is better to implement a custom widget instead.

Calling the method from the base class might for example corrupt any previous drawing, unless the method was implemented with calling form derived classes in mind. I don't expect that is the case for stock widgets. I haven't tried doing it with QLabel re-implementations in particular, but I have tried it with other stock widgets and it did not work as expected.

Upvotes: 1

Evgeny
Evgeny

Reputation: 4010

Well, I think you should call paintEvent of base class. Add parameter name e to method:

void DrawLabel::paintEvent(QPaintEvent *e)

And then at end of method add

QLabel::paintEvent (e);

The second option do all painting by yourself directly at paintEvent.

Upvotes: 1

Related Questions