尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")

Trying to paint on a QLabel fails (cannot call member function 'virtual void QLabel::paintEvent(QPaintEvent*)' without object)

本文关键字:QLabel QPaintEvent 函数 成员 虚拟 无效 调用 aintEvent 失败 绘画 对象      更新时间:2023-10-16

我看过很多关于如何使用paintevent的例子,但我就是无法让它工作。

我的 .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);,我可以成功地在我的对话框上绘画,所以我应该走在正确的道路上!

提前感谢您的任何答案!

你必须对标签做与你对QDialog完全相同的事情,这是创建类,它将从QLabel继承并实现paintEvent函数。例:

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

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