QTreeWidgetItem operator<

QTreeWidgetItem operator<
E8
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
0

Potrzebuje posortować QTreeWidget po wartościach int a nie po QString. Dla przykładu mam: 0x1, 0x021, 0x2, 0x035, 0x3. Wynikiem sortowania po int powinno być 0x1, 0x2 , 0x021, 0x3, 0x035. Napisałem taką klasę:

Kopiuj
class TreeWidgetItem : public QTreeWidgetItem
{
public:
    TreeWidgetItem(QTreeWidget* parent);
    TreeWidgetItem();

    // QTreeWidgetItem interface
    
    bool operator <(const QTreeWidgetItem &other) const override;
    TreeWidgetItem &operator=(const TreeWidgetItem &other);
};
Kopiuj
TreeWidgetItem::TreeWidgetItem(QTreeWidget *parent): QTreeWidgetItem(parent)
{

}

TreeWidgetItem::TreeWidgetItem()
{

}

bool TreeWidgetItem::operator <(const QTreeWidgetItem &other) const
{
    bool ok_num, ok_num2;
    int sortCol = treeWidget()->sortColumn();
    int num = text(sortCol).toUInt(&ok_num,16);
    int num2 = other.text(sortCol).toUInt(&ok_num2,16);
    if(ok_num && ok_num2)
    {
        return num<num2;
    }
    else
    {
        return text(sortCol) < other.text(sortCol);
    }
}

W klasie main wszędzie gdzie używałem QTreeWidgetItem , zamieniłem na typ TreeWidgetItem. Ale pojawiły się błedy:

Kopiuj
itemList = ui->treeWidget->selectedItems();

error: no match for 'operator=' (operand types are 'QList<TreeWidgetItem>' and 'QList<QTreeWidgetItem>')**

Kopiuj
findList = ui->treeWidget->findItems(ui->searchText->toPlainText(), Qt::MatchRecursive,selectedColumn);

error: no match for 'operator=' (operand types are 'QList<TreeWidgetItem>' and 'QList<QTreeWidgetItem>')**

Próbowałem przeładować operator=

Kopiuj
TreeWidgetItem &TreeWidgetItem::operator=(const TreeWidgetItem &other)
{
    list=other.list;
    return *this;
}

gdzie list jest typu QList<TreeWidgetItem*> ale nie pomogło.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 minuty
  • Lokalizacja:Szczecin
1

Z tego co piszesz, findItems zwraca QList<qtreewidgetitem*>

Swoją drogą, sortowanie które przedstawiłeś nie wygląda jak sortowanie po wartości int.


E8
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
0

Spróbowałem z QList<QTreeWidgetItem*> list. Ale dalej występują te same błędy.

twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
0

Ogólnie problem zdaje się wynikać z faktu, że tworzysz klasę pochodną, żeby zdefiniować porządek klasy bazowej. Jestem prawie pewien, że do posortowania wystarczy podać jakiś komparator - wszystko zależy od funkcji, której używasz do sortowania.

Wynikiem sortowania po int powinno być 0x1, 0x2 , 0x021, 0x3, 0x035
Dlaczego 0x3 jest większe od 0x21?

edytowany 2x, ostatnio: twonek
E8
Mój błąd z tym wynikiem sortowania :P
E8
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 7 lat
  • Postów:33
0

Wiem gdzie był błąd. Jak definiowałem findList i itemList to zmieniłem ich typ na QList<TreeWidgetItem*> zamiast zostawić QList<QTreeWidgetItem*> Błędy zniknęły. Ale sortowanie działa źle...

//EDIT

Udało się :)

Kopiuj
bool TreeWidgetItem::operator <(const QTreeWidgetItem &other) const
{
    bool ok_num, ok_num2;
    int sortCol = treeWidget()->sortColumn();
    int num = text(sortCol).toUInt(&ok_num,16);
    int num2 = other.text(sortCol).toUInt(&ok_num2,16);
    if(ok_num && ok_num2)
    {
        return num<num2;
    }
    else
    {
        return text(sortCol) < other.text(sortCol);
    }
}

Wartości QString były bardzo duże. Nie mięściły się w int. Wystarczyło zmienić na

Kopiuj
uint
edytowany 1x, ostatnio: enigma89
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:5 minut
0

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.