#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
функция не должна изменять свой класс, вы должны соблюдать это «правило» и пересмотреть свое переопределение/реализацию.