- All (478)
- jom (0)
- Qt Linguist (7)
- Qt Eclipse Integration (9)
- Qt Designer (7)
- Qt Creator (4)
- Qt build system: qmake (31)
- Qt build system: configure (3)
- Qt Assistant (5)
- Printing (4)
- Porting from Qt 3 to Qt 4 (1)
- Plugins (7)
- Qt Visual Studio AddIn (2)
- Qt/MFC Migration (2)
- QtScript (3)
- MDI (2)
- XML (1)
- Widgets (22)
- WebKit (5)
- Tools and Containers (2)
- Threads (2)
- Text Handling (10)
- SQL (6)
- QtTest (1)
- QtService (1)
- Platform: Windows (49)
- Platform: Unix (16)
- Platform: Mac OS X (18)
- Image Formats (2)
- I/O (2)
- Graphicsview (8)
- Font handling (9)
- Event System (18)
- Drag and Drop (4)
- Dialogs (6)
- Desktop integration (3)
- ActiveQt (3)
- Itemviews (60)
- Layout (4)
- Qt Quick (10)
- Qt SDK (1)
- Licensing (2)
- Platform: Embedded Linux (38)
- Painting (32)
- OpenGL (4)
- Object Model (6)
- Network (5)
- Multimedia (3)
- Miscellanous (23)
- Main Window (19)
- Look and Feel (23)
- Development (0)
- Getting Involved (0)
- Routines (0)
How can I sort the items in a QTableWidget on multiple columns?
This will depend a little on the size of your dataset. Since we use a stable
sort you can relatively easily achieve this by keeping a list of sort columns
and sort them from last to first.
If you have a lot of records you might want to implement your own model that
will more efficiently sort based on multiple columns.
- #include <QtGui>
- #define SETPERSON(index, first, second, salary) setItem(index, 0, new QTableWidgetItem(first));
- {
- Q_OBJECT
- public:
- {
- SETPERSON(0, "Jerry", "Springer", 1000000);
- SETPERSON(1, "Foo", "Springer", 12341);
- SETPERSON(2, "John", "Wayne", 12341);
- SETPERSON(3, "Bob", "Carver", 80000);
- SETPERSON(4, "Bob", "Carver", 81000);
- SETPERSON(5, "Bob", "Ulong", 60000);
- updateSortOrder();
- connect(horizontalHeader(), SIGNAL(sectionClicked(int)),
- this, SLOT(onHeaderClicked(int)));
- disconnect(horizontalHeader(), SIGNAL(sectionPressed(int)), this, SLOT(selectColumn(int)));
- }
- void updateSortOrder()
- {
- QStringList list;
- list << "First name" << "Last name" << "Salary";
- for (int i=0; i<sortOrder.size(); ++i)
- setHorizontalHeaderLabels(list);
- for (int i=sortOrder.size() - 1; i>=0; --i) {
- }
- }
- public slots:
- void onHeaderClicked(int section)
- {
- bool ascending = true;
- if (!sortOrder.isEmpty() && sortOrder.first().column == section) {
- ascending = !sortOrder.first().ascending;
- }
- sortOrder.clear();
- } else {
- const int index = findSection(section);
- if (index != -1) {
- if (index == sortOrder.size() - 1) {
- ascending = !sortOrder.last().ascending;
- }
- sortOrder.removeAt(index);
- }
- }
- sortOrder.append(SortData(section, ascending));
- updateSortOrder();
- }
- private:
- int findSection(int section) const
- {
- for (int i=0; i<sortOrder.size(); ++i) {
- if (sortOrder.at(i).column == section)
- return i;
- }
- return -1;
- }
- struct SortData {
- SortData(int sec = -1, bool asc = true) : column(sec), ascending(asc) {}
- int column;
- bool ascending;
- };
- };
- #include "main.moc"
- int main(int argc, char **argv)
- {
- Table w;
- w.show();
- return a.exec();
- }

No comments