覆盖 QLabel 以能够绘制图形
Overriding QLabel to be able to draw graphs
我想在我的主窗体上绘制图表,所以我想我会使用 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);
}
在我的主 window 上,我放下了一个 QLabel,将其大小调整为大约 500x200 并将其提升为 DrawLLabel。当应用程序为 运行 时,表格上会绘制一个虚线方块。
到目前为止一切都很好。
如果我添加以下行:
this->setText("123456");
到 DrawLabel 构造函数中,或将其添加到 paintEvent() 中我没有看到文本。我还希望能够在 DrawLabel 周围添加边框,但是
this->setFrameShape(QFrame::Box);
在构造函数中也不起作用。
我应该怎么做才能让这些发挥作用?
好吧,我认为你应该调用基数 class 的 paintEvent
。将参数名称 e
添加到方法:
void DrawLabel::paintEvent(QPaintEvent *e)
然后在方法末尾添加
QLabel::paintEvent (e);
第二种选择直接在paintEvent
自己画。
如果您想要自定义的东西,请实现一个继承 QWidget
的自定义小部件。然后你就可以随心所欲地画画,随心所欲地拥有成员。
您的问题是您覆盖了标签的绘制事件,因此未执行绘制标签文本的代码。
您可以按照 Evgeny 的建议从 QLabel
调用方法,但最好改为实现自定义小部件。
从基础调用方法 class 可能 例如破坏任何以前的绘图,除非该方法是通过调用派生的形式实现的 classes头脑。我不希望股票小部件出现这种情况。我还没有尝试用 QLabel
re-implementations 来做这件事,但我已经尝试过用其他股票小部件来做,但它没有按预期工作。
我想在我的主窗体上绘制图表,所以我想我会使用 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);
}
在我的主 window 上,我放下了一个 QLabel,将其大小调整为大约 500x200 并将其提升为 DrawLLabel。当应用程序为 运行 时,表格上会绘制一个虚线方块。
到目前为止一切都很好。
如果我添加以下行: this->setText("123456");
到 DrawLabel 构造函数中,或将其添加到 paintEvent() 中我没有看到文本。我还希望能够在 DrawLabel 周围添加边框,但是
this->setFrameShape(QFrame::Box);
在构造函数中也不起作用。
我应该怎么做才能让这些发挥作用?
好吧,我认为你应该调用基数 class 的 paintEvent
。将参数名称 e
添加到方法:
void DrawLabel::paintEvent(QPaintEvent *e)
然后在方法末尾添加
QLabel::paintEvent (e);
第二种选择直接在paintEvent
自己画。
如果您想要自定义的东西,请实现一个继承 QWidget
的自定义小部件。然后你就可以随心所欲地画画,随心所欲地拥有成员。
您的问题是您覆盖了标签的绘制事件,因此未执行绘制标签文本的代码。
您可以按照 Evgeny 的建议从 QLabel
调用方法,但最好改为实现自定义小部件。
从基础调用方法 class 可能 例如破坏任何以前的绘图,除非该方法是通过调用派生的形式实现的 classes头脑。我不希望股票小部件出现这种情况。我还没有尝试用 QLabel
re-implementations 来做这件事,但我已经尝试过用其他股票小部件来做,但它没有按预期工作。