Recommend hosting
TIMEWEB

# Qt/C++ - Lesson 062. Comparator for sorting QList

When working with simple types, you can use standard sorting tools. If you want to sort complex objects, by a set of parameters, then you need to write a special comparator, which will perform a comparison on the required parameters.

Let's write a small comparator that will sort objects of class QPointF . Sorting rules will be simple. First of all, the sorting should be done on the X coordinate, and if the X coordinates are the same, then we sort by the Y coordinate.

That is, before sorting the list can look like this:

(QPointF(12.4,15.4), QPointF(14.1,7.5), QPointF(7.2,5.2), QPointF(4.2,18.5), QPointF(4.2,1.2), QPointF(-19.5,12.4), QPointF(1.1,1.2))

After sorting the list will look like this:

(QPointF(-19.5,12.4), QPointF(1.1,1.2), QPointF(4.2,1.2), QPointF(4.2,18.5), QPointF(7.2,5.2), QPointF(12.4,15.4), QPointF(14.1,7.5))

## Comparator

Let us write the comparator as a static function:

// The comparator must be a static function,
// Otherwise it will not be possible to pass it as an argument
static bool compare(const QPointF& first, const QPointF& second)
{
if (first.x() < second.x())
{
return true;
}
else if (first.x() > second.x())
{
return false;
}
else
{
if (first.y() < second.y())
{
return true;
}
else
{
return false;
}
}

}

## Using the comparator

// Create and fill the list
QList<QPointF> pointsList;
pointsList << QPointF(12.4, 15.4)
<< QPointF(14.1, 7.5)
<< QPointF(7.2, 5.2)
<< QPointF(4.2, 18.5)
<< QPointF(4.2, 1.2)
<< QPointF(-19.5, 12.4)
<< QPointF(1.1, 1.2);

// Let's check the content of the list
qDebug() << pointsList;

// sort
std::sort(pointsList.begin(), pointsList.end(), compare);

// check result
qDebug() << pointsList;

The result will be similar to the one that was given at the beginning.

##### 10% refund of hotel reservation amount on Booking
We offer a link with a 10% return on the amount of the order when booking a hotel through Booking

Only authorized users can post comments.
МБ
April 21, 2019, 9:40 a.m.
###### Моисей Бушуев

Qt - Test 001. Signals and slots

• Result:0points,
• Rating points-10
AA
April 17, 2019, 7:40 p.m.
###### Anton Ablin

Qt - Test 001. Signals and slots

• Result:73points,
• Rating points1
E
April 17, 2019, 6:16 p.m.
###### Evgeny

Qt - Test 001. Signals and slots

• Result:100points,
• Rating points10
April 21, 2019, 4:22 p.m.
###### Евгений Легоцкой

April 21, 2019, 3:48 p.m.
###### Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
###### Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
###### uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
###### Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 23, 2019, 6:39 p.m.
###### BlinCT

Вопрос закрыт) проблема найдена
April 21, 2019, 4:16 p.m.
###### Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
###### RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Е
April 17, 2019, 4:05 p.m.
###### Евгений_Канусовский@1981

Всем спасибо за помощь!
i
April 17, 2019, 3:03 p.m.
###### ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...