An example of QStyledItemDelegate formatting doubles
-
Hello, I tried approaching formatting through telling the QSqlQueryModel on which columns to return
Qt::AlignRight
forQt::TextAlignmentRole
. Now I understand that I need to subclass QStyledItemDelegate. All I need to know is how to subclass in a minimalistic way (according to this post, I only need to override displayText() method). I tried googling examples and only found star-rating editor example which is not helpful in my case. I tried googling QSID source code, but didn't get any idea.
Please, clarify how do I change formatting (of toString conversion) and alignment of content. -
change formatting is easy, as you already hinted is just about reimplementing
displayText
and return aQString
representation of the data you have. The alignment is completely different. You need to reimplement paint, and make a small change to the original one:void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_ASSERT(index.isValid()); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; // only change vs the original const QWidget *widget = option.widget; QStyle *style = widget ? widget->style() : QApplication::style(); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget); }
alternatively you can subclass
QSqlQueryModel
and reimplementdata
:class AlignedQueryModel : public QSqlQueryModel{ Q_OBJECT Q_DISABLE_COPY(AlignedQueryModel) public: explicit AlignedQueryModel(QObjetc* parent = Q_NULLPTR) : QSqlQueryModel(parent){} QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE{ if(role == Qt::TextAlignmentRole && item.column()<2) //the first 2 columns are right aligned return Qt::AlignRight | Qt::AlignVCenter; return QSqlQueryModel::data(item,role); } };
-
change formatting is easy, as you already hinted is just about reimplementing
displayText
and return aQString
representation of the data you have. The alignment is completely different. You need to reimplement paint, and make a small change to the original one:void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_ASSERT(index.isValid()); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; // only change vs the original const QWidget *widget = option.widget; QStyle *style = widget ? widget->style() : QApplication::style(); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget); }
alternatively you can subclass
QSqlQueryModel
and reimplementdata
:class AlignedQueryModel : public QSqlQueryModel{ Q_OBJECT Q_DISABLE_COPY(AlignedQueryModel) public: explicit AlignedQueryModel(QObjetc* parent = Q_NULLPTR) : QSqlQueryModel(parent){} QVariant data(const QModelIndex &item, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE{ if(role == Qt::TextAlignmentRole && item.column()<2) //the first 2 columns are right aligned return Qt::AlignRight | Qt::AlignVCenter; return QSqlQueryModel::data(item,role); } };
@VRonin Hello, for now I can't unfortunately get a single of those methods to work. I've started debugging with simpler one, displayText() and it just doesn't work. My other delegates which are inherited from QItemDelegate have a QWidget argument in the constructor. This one doesn't, I hope it's not what makes the difference
Here's doubledelegate .h/.cpp -
@VRonin Hello, for now I can't unfortunately get a single of those methods to work. I've started debugging with simpler one, displayText() and it just doesn't work. My other delegates which are inherited from QItemDelegate have a QWidget argument in the constructor. This one doesn't, I hope it's not what makes the difference
Here's doubledelegate .h/.cpp@starryeyed said in An example of QStyledItemDelegate formatting doubles:
My other delegates which are inherited from QItemDelegate have a QWidget argument in the constructor. This one doesn't,
What one doesn't?
Only @VRonin's first example uses
QItemDelegate
, and he's only given you thepaint()
override, so you can have what you like in your constructor forMyDelegate
, like the baseQItemDeletegate
.His second example doesn't use a
QItemDelegate
, it just sub-classesQSqlQueryModel
.Both
QItemDelegate
&QSqlQueryModel
constructors take an optionalQObject *parent = nullptr
. Like many Qt classes, this is just to set the parent. I don't see how that's relevant to whether they work or not. -
@starryeyed said in An example of QStyledItemDelegate formatting doubles:
My other delegates which are inherited from QItemDelegate have a QWidget argument in the constructor. This one doesn't,
What one doesn't?
Only @VRonin's first example uses
QItemDelegate
, and he's only given you thepaint()
override, so you can have what you like in your constructor forMyDelegate
, like the baseQItemDeletegate
.His second example doesn't use a
QItemDelegate
, it just sub-classesQSqlQueryModel
.Both
QItemDelegate
&QSqlQueryModel
constructors take an optionalQObject *parent = nullptr
. Like many Qt classes, this is just to set the parent. I don't see how that's relevant to whether they work or not.@JonB I'm sorry for digging in wrong direction, I mistook compiler's errors about "overriding private parts of class", thought that it was related to constructor because the error was on constructor's definition line.
So everything works. Blessings go out to the patience of local gurus -
@JonB I'm sorry for digging in wrong direction, I mistook compiler's errors about "overriding private parts of class", thought that it was related to constructor because the error was on constructor's definition line.
So everything works. Blessings go out to the patience of local gurus@starryeyed You want to be careful about "overriding private parts", it can be painful ;-)