Ошибка компиляции при определении и использовании переменной класса в Qt QStyledItemDelegate

#c #qt #delegates

Вопрос:

Я определяю MsgNameIdDelegate класс, который наследуется от QStyledItemDelegate :

Файл заголовка:

 #include <QStyledItemDelegate>

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

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

private:
    int I;
};

#endif // MsgNameIdDelegate_H
 

Исходный файл:

 #include <QApplication>
#include <QPainter>

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

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

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

Как вы можете видеть, я определяю переменную класса с именем by 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 constamp;, QModelIndex constamp;) const':
msgnameiddelegate.cpp:(.text 0x23b): undefined reference to `MsgNameIdDelegate::I'
 

Примечание: Я использую Qt 5.15.2 в Ubuntu 20.04.

Ответ №1:

const Квалификатор в объявлении paint функции вашего MsgNameIdDelegate класса сообщает компилятору, что эта функция не изменяет объект класса, для которого она вызывается. Однако в определении этой функции вы (пытаетесь) изменить объект в I = 10; инструкции.

Вам нужно либо: (а) удалить const классификатор; либо (б) объявить I элемент как static (как вы пытались), а затем предоставить определение этой переменной (в исходном файле) со строкой, подобной этой:

 int MsgNameIdDelegate::I{0};
 

Однако имейте в виду, что использование этой static опции будет означать, что существует только один экземпляр этой I переменной, общий для всех объектов класса.

Комментарии:

1. Thx, но в решении (a) я не смог удалить const из определения функции, потому QStyledItemDelegate что это внутренний класс Qt. Для решения (b), как вы правильно предлагаете, я пытаюсь определить переменную для каждого объекта и не разделяю ее между всеми объектами, поэтому статическая переменная бесполезна.

2. @AbolfazlDiyanat Я не уверен, почему ваш класс, производный от внутреннего класса Qt, мешает вам удалить const классификатор. MsgNameIdDelegate Класс ваш , так что вы можете делать с ним все, что вам нравится (в разумных пределах). Если только вы не переопределяете virtual базовую функцию-член?

3. Я унаследовал от QStyledItemDelegate . Этот класс является реализацией абстрактного класса QStyledItemDelegate . Оба они являются внутренним классом Qt. Это определение paint функции в QStyledItemDelegate классе : virtual void paint(QPainter *painter, const QStyleOptionViewItem amp;option, const QModelIndex amp;index) const = 0; .

4. @AbolfazlDiyanat ХОРОШО, справедливое замечание. Тогда я бы предложил, чтобы, если реализация Qt говорит, что paint функция не должна изменять свой класс, вы должны соблюдать это «правило» и пересмотреть свое переопределение/реализацию.