2016-01-13 115 views
-1

我想在我的主窗体上绘制图形,所以我想我会使用QLabel并覆盖它。就像这样:覆盖QLabel能够绘制图形

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

在我的主窗口,我droppde一个QLabel,其大小约500x200,并晋升为DrawLLabel。当应用程序运行时,表单上会绘制一个虚线正方形。

目前为止都不错。

如果我加上这一行: this-> setText(“123456”);

进入DrawLabel构造函数,或将其添加到paintEvent()中我看不到文本。我也想能够在DrawLabel周围有一个边框,但是

this->setFrameShape(QFrame::Box); 

在构造函数中也不起作用。

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

+0

一个建议:在'paintevent'声明中加上'override'。如果您可能拼错,这很有用。 – Zen

回答

1

嗯,我想你应该打电话paintEvent的基类。添加参数名称e到方法:

void DrawLabel::paintEvent(QPaintEvent *e) 

然后在方法的末尾添加

QLabel::paintEvent (e); 

第二种选择自己直接paintEvent做画。

+0

这似乎是工作 - 至少对于文本。设置边框似乎不起作用,但:(谢谢你的帮助。 –

+0

然后你应该自己琢磨一下边框。请将标记为有效的答案。 – Evgeny

1

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

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

您可以根据Evgeny的建议从QLabel中调用方法,但最好实现一个自定义小部件。

调用基类的方法可能例如会破坏以前的任何绘图,除非该方法是在调用窗体派生类的基础上实现的。我不认为股票小部件就是这种情况。我没有试过用QLabel重新实现它,但我已经尝试过与其他库存小部件一起使用,但它没有按预期工作。

+0

谢谢@ddriver。我得仔细研究一下。自定义小部件通过使用QLabel,我希望获得许多已经实现的好东西,再次感谢。 –