qСортировка сортирует указатели, а не объекты, на которые указывают эти указатели.Если вы хотите отсортировать LogEvents с помощью qSort, вам придется хранить их по значению, а не по ссылке (а также иметь операторы сравнения, которые принимают ссылку, qSort не найдет ваши функции сравнения с указателем) или передаст третьюаргумент с функцией, которую вы определяете.
Это может объяснить, почему это так с примерами.
LogEvent event1, event2;
LogEvent *eventptr1=&event1,*eventptr2=&event2;
event1<event2; // Operator not defined in your code
event1<eventptr2; // This will call the operator you have defined
eventptr1<eventptr2; // This will compare the pointers themselves, not the LogEvents. The pointers are not dereferenced here.
ETA: В интересах иметь один полный ответ для принятия, ясобираюсь оторвать несколько хороших битов из других ответов здесь.
Сначала определите стандартный синтаксис меньше оператора:
class LogEvent : public QTreeWidgetItem {
public:
// ...
bool operator<(const LogEvent *); // Non-standard, possibly reasonable for use in your own code.
bool operator<(const LogEvent &); // Standard, will be used by most template algorithms.
// ...
}
LogEvent.cpp
bool LogEvent::operator<(const LogEvent &event) {return timestamp<event.timestamp;}
Как только это будет сделано, вы можете использовать этот шаблон разыменования и сравнения из ответа Лима:
template<class T>
bool dereferencedLessThan(T * o1, T * o2) {
return *o1 < *o2;
}
, чтобы отсортировать ваш список следующим образом:
QVector<LogEvent *> currentItems;
//add a bunch of LogEvent objects to currentItems
qSort(list.begin(), list.end(), dereferencedLessThan<LogEvent>);
Для полноты, он будетбыть хорошей формой, чтобы определить стандартные операторы сравнения синтаксиса для всех ваших сравнений.Держите ли вы нестандартные операторы сравнения на ваше усмотрение.