在 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 的所有对象共享。
我定义了一个 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 的所有对象共享。