覆盖QLabel以绘制图形

时间:2016-01-13 20:06:35

标签: qt qpainter qlabel

我想在我的主窗体上绘制一个图形,所以我想我会使用QLabel和Override。像这样:

// 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);
}

在我的主窗口上,我放置一个QLabel,将其大小调整为大约500x200并将其提升为DrawLLabel。运行应用程序时,表单上会绘制一个虚线方框。

到目前为止一切都很好。

如果我添加该行:     这 - &GT;的setText( “123456”);

进入DrawLabel构造函数,或将其添加到paintEvent()中我看不到文本。我也希望能够在DrawLabel周围设置边框,但

this->setFrameShape(QFrame::Box);
构造函数中的

也不起作用。

我应该怎么做才能让这些工作?

2 个答案:

答案 0 :(得分:1)

好吧,我认为你应该调用基类的paintEvent。将参数名称e添加到方法:

void DrawLabel::paintEvent(QPaintEvent *e)

然后在方法结束时添加

QLabel::paintEvent (e);

第二个选项直接在paintEvent上自行绘画。

答案 1 :(得分:1)

如果您想要自定义内容,请实现继承QWidget的自定义窗口小部件。然后你可以画任何你想要的东西,并拥有你想要的任何成员。

您的问题是您已覆盖标签的绘图事件,因此不会执行绘制标签文本的代码。

您可以像Evgeny建议的那样从QLabel调用该方法,但最好实现自定义小部件。

从基类中调用方法可能例如损坏任何以前的绘图,除非该方法是在考虑调用表格派生类的情况下实现的。我不希望库存小部件就是这种情况。我没有尝试过特别是QLabel重新实现,但是我已经尝试过使用其他库存小部件而且它没有按预期工作。