PDA

View Full Version : Renumbering Row Headers of QHeaderView



mclark
8th September 2006, 16:59
Greetings,

I am using a QTableWidget with both vertical and horizontal headers. How can I manually renumber the vertical row headers after a move?

When QHeaderView does a sort (when I click on a column header) the row header numbers do not change, only the contents of the cells. I am trying to do a similar thing using QHeaderView::moveSection() (kind of a custom sort).


QHeaderView* pHeaderView = verticalHeader();
pHeaderView->moveSection( nSrcRow, nDestRow );While the row contents are exchanged as I expect, the row header numbers also change. I would like to always keep a 1,2,3 kind of labeling like the built-in QHeaderView sort.

wysota
8th September 2006, 17:38
If you use QTableView instead of QTableWidget, you can simpy return header names in a different order (see QAbstractItemModel::headerData for details).

mclark
8th September 2006, 18:22
Thanks for the quick reply.

Using QTableView is currently not an option because of time restraints. After the release of the product, we will try to convert all our QTableWidget code to QTableView for subsequent releases.

We may have to leave this feature out of this release.

jpn
8th September 2006, 21:20
You could connect to signal QHeaderView::sectionMoved() and rename headers every time a section movement occurs. Just make sure you create and set header items.



// it is important to create and set header items
// otherwise horizontalHeaderItem(int) and verticalHeaderItem(int) will always return 0
for (int r = 0; r < rowCount(); ++r)
{
QTableWidgetItem* item = new QTableWidgetItem(QString::number(r));
setVerticalHeaderItem(r, item);
}

for (int c = 0; c < columnCount(); ++c)
{
QTableWidgetItem* item = new QTableWidgetItem(QString::number(c));
setHorizontalHeaderItem(c, item);
}

connect(horizontalHeader(), SIGNAL(sectionMoved(int, int, int)), SLOT(renameHeaders()));
connect(verticalHeader(), SIGNAL(sectionMoved(int, int, int)), SLOT(renameHeaders()));




// the slot doing the renaming
void TableWidget::renameHeaders()
{
// "convert" logical indexes to visual indexes
for (int r = 0; r < rowCount(); ++r)
verticalHeaderItem(r)->setText(QString::number(verticalHeader()->visualIndex(r)));

for (int c = 0; c < columnCount(); ++c)
horizontalHeaderItem(c)->setText(QString::number(horizontalHeader()->visualIndex(c)));
}

mclark
11th September 2006, 15:04
Thanks, jpn, this looks like a workable solution for my circumstances.