试图在QLabel上绘画失败(无法在没有对象的情况下调用成员函数'virtual void QLabel :: paintEvent(QPaintEvent *)')

时间:2012-08-15 17:00:02

标签: c++ qt paint

我见过许多关于如何使用痛苦事件的例子,但我无法让它发挥作用。

我的.ui文件中有一个名为'image'的标签,我正在尝试在其中绘画。我悲惨地失败了。在大多数示例中,我看到他们使用

QLabel::paintEvent(e)

但我不能用这个,我得到:

error: cannot call member function 'virtual void QLabel::paintEvent(QPaintEvent*)' without object

而且,当我使用

ui->image->paintEvent(e);

我得到了

/usr/include/qt4/QtGui/qlabel.h:141: error: 'virtual void QLabel::paintEvent(QPaintEvent*)' is protected

我似乎错过了一些东西......这是我尝试实现此代码的一部分:

void crop_my_image::paintEvent(QPaintEvent *e)
{
    ui->image->paintEvent(e);
    QPainter painter(ui->image);
    painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine));
    painter.setBrush(QBrush(QColor(255,255,255,120)));
    painter.drawRect(selectionRect);
}

crop_my_image属于QDialog类型!

PS:如果我使用ui->image->paintEvent(e);代替QDialog::paintEvent(e);我可以成功绘制对话框,那么我应该走在正确的道路上!

提前感谢您的任何答案!

1 个答案:

答案 0 :(得分:3)

你必须使用QDialog做的标签完全相同,QDialog是将继承自QLabel并实现paintEvent函数的create类。例如:

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

//MyLabel.cpp

MyLabel::MyLabel(QWidget *parent)
    : QLabel(parent)
{
    /*...*/

}

void MyLabel::paintEvent(QPaintEvent *)
{
    /* paint somehting on your label*/
}

而且你可以做到:

void crop_my_image::paintEvent(QPaintEvent *e)
{
    myLabelObject->paintEvent(e);
    QPainter painter(ui->image);
    painter.setPen(QPen(QBrush(QColor(0,0,0,180)),1,Qt::DashLine));
    painter.setBrush(QBrush(QColor(255,255,255,120)));
    painter.drawRect(selectionRect);
}

但首先,为什么要调用此方法的事件?