在 Qt QStyledItemDelegate 中定义和使用 class 变量时编译错误

Compile error when define and use class variable in Qt QStyledItemDelegate

我定义了一个 MsgNameIdDelegate class 继承自 QStyledItemDelegate:

头文件:

#include <QStyledItemDelegate>

class MsgNameIdDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    MsgNameIdDelegate(QObject *parent = 0);

protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

private:
    int I;
};

#endif // MsgNameIdDelegate_H

源文件:

#include <QApplication>
#include <QPainter>

MsgNameIdDelegate::MsgNameIdDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}

QSize MsgNameIdDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
    qDebug()<<I;
}

void MsgNameIdDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    I = 10;
    QApplication::style()->drawItemText(painter, option.rect, Qt::AlignHCenter|Qt::AlignVCenter| Qt::TextLongestVariant, option.palette, true, "Example");
}

如您所见,我定义了一个class变量,命名为I。但是,当我编译代码时,出现以下编译错误:

msgnameiddelegate.cpp:85:7: error: cannot assign to non-static data member within const member function 'paint'
msgnameiddelegate.cpp:77:25: note: member function 'MsgNameIdDelegate::paint' is declared const here

此外,当我将变量 I 定义为静态变量时,出现以下编译错误:

in function `MsgNameIdDelegate::sizeHint(QStyleOptionViewItem const&, QModelIndex const&) const':
msgnameiddelegate.cpp:(.text+0x23b): undefined reference to `MsgNameIdDelegate::I'

注:我在Ubuntu20.04.

中使用Qt 5.15.2

MsgNameIdDelegate class 的 paint 函数的 声明 中的 const 限定符告诉编译器函数 不会修改 调用它的 class 对象。但是,在该函数的 definition 中,您 do (尝试)修改对象,在I = 10; 语句。

您需要:(a) 删除 const 限定符;或 (b) 将 I 成员声明为 static(如您所试),然后提供该变量的定义(在您的源文件中),其中像这样的一行:

int MsgNameIdDelegate::I{0};

但是,请记住,使用 static 选项意味着 I 变量只有一个实例,由 class 的所有对象共享。