formatting a QTableView header
-
Hi all -
My main UI looks like this:
The QTableView is the white box near the top. The first row of text (the "MAC Address Serial Number Device Name" is the header data (set in the model). The line that begins "b4:e6" is the first row of data in the table.
I'd like to improve this display, and the first thing that comes to mind is to visually set off the header from the data. I've looked through the pages on models and tableviews, but I can't find how to go about formatting this. Could someone point me in the right direction?
Thanks...
-
Hi all -
My main UI looks like this:
The QTableView is the white box near the top. The first row of text (the "MAC Address Serial Number Device Name" is the header data (set in the model). The line that begins "b4:e6" is the first row of data in the table.
I'd like to improve this display, and the first thing that comes to mind is to visually set off the header from the data. I've looked through the pages on models and tableviews, but I can't find how to go about formatting this. Could someone point me in the right direction?
Thanks...
You can customize the header through returning the appropriate values for the roles from the model. But(!), it'd depend on how your program's organized. How do you populate the header?
-
Like so:
m_model->insertColumns(0, TAG_NBRTAGS); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number")); m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address")); m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"));
-
Like so:
m_model->insertColumns(0, TAG_NBRTAGS); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number")); m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address")); m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"));
Okay. Firstly you should use
Qt::DisplayRole
, not the defaultQt::EditRole
. Then you can modify further[1]:- Icons - Qt::DecorationRole
- Font - Qt::FontRole
- Alignment - Qt::TextAlignmentRole
and so on.
-
Okay. Firstly you should use
Qt::DisplayRole
, not the defaultQt::EditRole
. Then you can modify further[1]:- Icons - Qt::DecorationRole
- Font - Qt::FontRole
- Alignment - Qt::TextAlignmentRole
and so on.
@kshegunov: wow -- this is fairly involved stuff. So, do I need to create a bitmap image of a line to use as an icon that would be my delimiter? (Not sure why font or alignment matter, as I'm trying to modify a data row, not the format of the text in that row.)
Thanks.
-
@kshegunov: wow -- this is fairly involved stuff. So, do I need to create a bitmap image of a line to use as an icon that would be my delimiter? (Not sure why font or alignment matter, as I'm trying to modify a data row, not the format of the text in that row.)
Thanks.
@mzimmers said in formatting a QTableView header:
wow -- this is fairly involved stuff. So, do I need to create a bitmap image of a line to use as an icon that would be my delimiter? (Not sure why font or alignment matter, as I'm trying to modify a data row, not the format of the text in that row.)
Not really, no. What you should start with is to use
Qt::DisplayRole
so not to get the weird header (currently it thinks it's an editor of sorts). As a second step you can set any of the mentioned roles to get more customized looks. -
I made the change to DisplayRole, but I don't see a difference in the header. What is it supposed to look like?
@mzimmers said in formatting a QTableView header:
What is it supposed to look like?
I imagined it would be gray after changing the role. Maybe it's just the style you're using. Try setting
Qt::BackgroundRole
to something to make it distinguishable. (assuming that's what you wanted to do in the first place). -
OK, I clearly have no idea what I'm doing. The whole concept of these "roles" eludes me.
I tried this, and it didn't work:
ui->tableView->horizontalHeader()->setBackgroundRole(QPalette::Window);
Try something like this:
m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
Roles give information of what kind of data you are keeping (think of it as the item's properties).
-
Still no visible change. Do I need to do something to the table view to reflect the change to the model object?
That's very odd. Do you mind sharing the
headerData
method of your model? Or is the modelQStandardItemModel
? -
My model is defined like this:
QAbstractItemModel *m_model; // the main model
But it's initialized like this:
DeviceModel::DeviceModel(QObject *parent) : QObject(parent), m_model(new QStandardItemModel(this)) { QString qs; QStringList qsl; m_model->insertColumns(0, TAG_NBRTAGS); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number"), Qt::DisplayRole); m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address"), Qt::DisplayRole); m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"), Qt::DisplayRole); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
Note the use of the QStandardItemModel in the c'tor. (I think VRonin gave me this code, way back when.)
Not sure if this is what you're asking for...
-
My model is defined like this:
QAbstractItemModel *m_model; // the main model
But it's initialized like this:
DeviceModel::DeviceModel(QObject *parent) : QObject(parent), m_model(new QStandardItemModel(this)) { QString qs; QStringList qsl; m_model->insertColumns(0, TAG_NBRTAGS); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, tr("Serial Number"), Qt::DisplayRole); m_model->setHeaderData(TAG_MACADDRESS, Qt::Horizontal, tr("MAC Address"), Qt::DisplayRole); m_model->setHeaderData(TAG_DEVICENAME, Qt::Horizontal, tr("Device Name"), Qt::DisplayRole); m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole);
Note the use of the QStandardItemModel in the c'tor. (I think VRonin gave me this code, way back when.)
Not sure if this is what you're asking for...
Yes, it is, but only partially. What does your
DeviceModel::headerData
contain? Does it just delegate to theQStandartItemModel
's method? -
I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member:
class DeviceModel : public QObject { Q_OBJECT private: QAbstractItemModel *m_model; // the main model
@mzimmers said in formatting a QTableView header:
I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member.
Indeed. My bad, sorry. It's rather odd. As far as I can tell this should be enough to have your header have a red background. As a follow up question: Do you use style sheets?
-
@mzimmers said in formatting a QTableView header:
I'm not doing anything with the header except what I posted above. DeviceModel is my own class that has the actual Qt model as a member.
Indeed. My bad, sorry. It's rather odd. As far as I can tell this should be enough to have your header have a red background. As a follow up question: Do you use style sheets?
@kshegunov said in formatting a QTableView header:
As a follow up question: Do you use style sheets?
No, not in this app.
-
@kshegunov said in formatting a QTableView header:
As a follow up question: Do you use style sheets?
No, not in this app.
I just tested a project of mine, and it works correctly. Here's what I did:
#include <QBrush> QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if (/*role != Qt::DisplayRole || */orientation != Qt::Horizontal || section > columnCount()) return QVariant(); if (role == Qt::DisplayRole) return columns.byIndex(section).displayName(); if (role == Qt::BackgroundRole) return QBrush(Qt::red); return QVariant(); }
I observe the background of the table view's header to be red. It's really odd why it doesn't work for you. Can you retrieve the header data just after you've set it to the model to see if it's correctly stored? I.e.
m_model->setHeaderData(TAG_SERIALNUMBER, Qt::Horizontal, QBrush(Qt::red), Qt::BackgroundRole); QBrush shouldBeRed = m_model->headerData(TAG_SERIALNUMBER, Qt::Horizontal, Qt::BackgroundRole);
PS: The test was done with Qt 5.11.2 on Linux.
-
QBrush brush = variant.value<QBrush>();
However you can inspect the data directly in the variant as well, as far as I can see in the watch.