Sortowanie w Qt - jak zrobić by program nie sugerował się wielkością liter.

0

Witam, mam bazę danych sqlite, i w sortowaniu pierwsze idą te z dużych liter, później te z małych. Czy isnieje jakiś sposób by nie zmieniając wielkości tych liter, normalnie program sortował ( w sensie (aAbB...)? Chyba kodu nie muszę wstawiać bo jest to po prostu

            model->setSort(2,Qt::AscendingOrder);
1

jeśli metoda z QT tego nie udostępnia to nie. Ale zawsze możesz pokombinować z zapytaniem SQL żeby dostać odpowiednio posortowane.

1

Napisałem ci o sql bo można sobie przy robieniu selecta różne rzeczy robić. To co masz dostępne zależy od bazy masz przykład:
SELECT * FROM myTable WHERE id= 5 ORDER BY LOWER(name)

0
revcorey napisał(a):

Napisałem ci o sql bo można sobie przy robieniu selecta różne rzeczy robić. To co masz dostępne zależy od bazy masz przykład:
SELECT * FROM myTable WHERE id= 5 ORDER BY LOWER(name)

No ale u mnie tak nie zrobi, a po drugie tu by było jak wyżej piszesz że abcABC a ja chcę aAbBcC czy tam AaBbCc

1

W SQLite sortowanie domyślnie jest case-sensitive, więc masz dwa wyjścia:

  • dłubanie bezpośrednio w zapytaniu klik (ale wtedy korzystanie z QSqlTableModel staje się bezsensowne)
  • stworzenie klasy dziedziczącej z QSortFilterProxyModel i reimplementacja metody lessThan
0
tajny_agent napisał(a):

W SQLite sortowanie domyślnie jest case-sensitive, więc masz dwa wyjścia:

  • dłubanie bezpośrednio w zapytaniu klik (ale wtedy korzystanie z QSqlTableModel staje się bezsensowne)
  • stworzenie klasy dziedziczącej z QSortFilterProxyModel i reimplementacja metody lessThan

Czyli ten m_sortingModel sobie zamienie potem na tą klasę którą napiszę tak?

QAbstractItemModel* DbManager::imageTableModel()
{
    if (!m_budleDecodedModel && m_db.isOpen())
    {
        m_tableModel = new QSqlTableModel(this, m_db);
        m_tableModel->setTable("products");
        m_tableModel->select();

        m_sortingModel =new QSortFilterProxyModel(this);
        m_sortingModel->setDynamicSortFilter(true);
        m_sortingModel->setSourceModel(m_tableModel);

        m_budleDecodedModel = new SqlBlobDecoderModel(this);
        m_budleDecodedModel->setSourceModel(m_sortingModel);
        m_budleDecodedModel->setImageColumn(TableImageColumn);
    }
    return m_budleDecodedModel;
}
1

Tak

2

Ja dodam, że to ma sens dla małych baz danych. Dla dużych będzie miało brzydkie konsekwencje.
Jeśli rozwiązanie ma się skalować lepiej użyć właściwego query: https://stackoverflow.com/a/48189092/1387438

0
MarekR22 napisał(a):

Ja dodam, że to ma sens dla małych baz danych. Dla dużych będzie miało brzydkie konsekwencje.
Jeśli rozwiązanie ma się skalować lepiej użyć właściwego query: https://stackoverflow.com/a/48189092/1387438

1.Moja baza będzie miała z 200-300 rekordów max, ta druga - zależy od użytkownika ale wątpie by też 300 przekroczyła - czyli raczej mała.
2. Ten sposób by raczej u mnie nie zadziałał gdyż nie będę miał możliwości tak operowania query bo na tableview mam setSortingEnabled(true) więc po kliknięciu w header "name"by nadal było tak samo. czyli ABCabc

0

Mam pytanie bo szukam, szukam ale nie mogę w necie znaleźć (pewnie źle wpisuje). Jest gdzieś miejsce gdzie można zobaczyć wszystkie te klasy, całe i headery i cpp tak jak one są napisane?
W sensie te co includujemy typu chociażby ten QSortFilterProxyModel

0
Xezolpl napisał(a):

Mam pytanie bo szukam, szukam ale nie mogę w necie znaleźć (pewnie źle wpisuje). Jest gdzieś miejsce gdzie można zobaczyć wszystkie te klasy, całe i headery i cpp tak jak one są napisane?
W sensie te co includujemy typu chociażby ten QSortFilterProxyModel

Hmmm, nie spodziewałem się że to takie łatwe i wystarczy jedna linijka kodu.
Ale jest problem - o ile działa fajnie w tableViewie to już nie działa w funkcji wstawiającej QAction do QMenu a mianowicie nie mam jak zaimplementować tego bo jak dam na QSqlTableModel ->MySortFilterProxyModel to on już nie ma setTable i setFilter, tak samo jak moja klasa do wyświetlania tabeli z obrazami - dziedziczy z QIdentityProxyModel.

Próbowałem zrobić że QSqlTableModel -> MySortFilterProxyModel -> QSqlTableModel ale znowuż QSqlTableModel nie ma funkcji setSourceModel(). Jakiś pomysł?

void Product::searchConfigure()
{
    QMenu *menu = new QMenu;
    QAbstractItemModel *model = dbManager->getBaseProductsModel();
    int max = model->rowCount();

    for (int i=0; i<max;)
    {

        dbManager->getProductValuesFromDatabase(i,1);
        QByteArray arrayX = dbManager->getByteArray();
        QString nameX = dbManager->getName();
        QImage imageX; imageX.loadFromData(arrayX);
        QAction *action = new QAction;
        action->setIcon(QIcon(QPixmap::fromImage(imageX)));
        action->setText(nameX);
        action->setVisible(true);
        menu->addAction(action);
        i++;

    }
    ui->btnsearsch->setMenu(menu);

}
bool DbManager::getProductValuesFromDatabase(int id, int table, QString name2)
{
    QSqlQuery query(m_db);
   // query.prepare("SELECT * FROM products WHERE productid=?");
    MySqlTableModel *model = new MySqlTableModel(this,m_db);

   // query.addBindValue(id);
    //query.exec();
    //model->mySetQuery(query);
    if((table==0) && (name2==""))
    {
        model->setTable("products");
        model->select();
        model->setFilter("productid="+QString::number(id));

                nm = model->record(0).value("name").toString();
                nt = model->record(0).value("notes").toString();
                kc = model->record(0).value("kcal").toInt();
                carb = model->record(0).value("carbonates").toInt();
                prot = model->record(0).value("proteins").toInt();
                fat = model->record(0).value("fats").toInt();
                wei = model->record(0).value("weight").toInt();
                dat = model->record(0).value("date").toDate();
                arr = model->record(0).value("img").toByteArray();
                typ = model->record(0).value("type").toInt();
    }
    else if((table!=0) && (name2==""))
    {
        
        model->setTable("baseproducts");
        model->setSort(2,Qt::AscendingOrder);
        model->select();
        nm = model->record(id).value("name").toString();
        nt = model->record(id).value("notes").toString();
        kc = model->record(id).value("kcal").toInt();
        carb = model->record(id).value("carbonates").toInt();
        prot = model->record(id).value("proteins").toInt();
        fat = model->record(id).value("fats").toInt();
        wei = model->record(id).value("weight").toInt();
        dat = model->record(id).value("date").toDate();
        arr = model->record(id).value("img").toByteArray();
        typ = model->record(id).value("type").toInt();
    }
    else if((table!=0) && (name2!=""))
    {
        model->setTable("baseproducts");
        model->select();
        model->setFilter("name='"+name2+"'");
                nm = model->record(0).value("name").toString();
                nt = model->record(0).value("notes").toString();
                kc = model->record(0).value("kcal").toInt();
                carb = model->record(0).value("carbonates").toInt();
                prot = model->record(0).value("proteins").toInt();
                fat = model->record(0).value("fats").toInt();
                wei = model->record(0).value("weight").toInt();
                dat = model->record(0).value("date").toDate();
                arr = model->record(0).value("img").toByteArray();
                typ = model->record(0).value("type").toInt();
    }
}

0
Xezolpl napisał(a):

Próbowałem zrobić że QSqlTableModel -> MySortFilterProxyModel -> QSqlTableModel ale znowuż QSqlTableModel nie ma funkcji setSourceModel(). Jakiś pomysł?

Hee? Chy ty rozumiesz co chcesz zrobić? Jaki to ma sens?
QSortFilterProxyModel ze swojej natur jest adapotrem do innych modeli danych.
A QSqlTableModel jest adaptorem do bazy danych (baza danych zaadaptowana do QTableView).

Ty masz trzymać wskaźniki do obu modeli. Jak potrzebujesz coś związanego z bazą danych to operujesz an QSqlTableModel, a jak zmienić sortowanie to operujesz na MySortFilterProxyModel. Tak masz to teraz zaprojektowane.
Jak coś się zmieni w QSqlTableModel to MySortFilterProxyModel zaktualizuje się automagicznie.

0
MarekR22 napisał(a):
Xezolpl napisał(a):

Próbowałem zrobić że QSqlTableModel -> MySortFilterProxyModel -> QSqlTableModel ale znowuż QSqlTableModel nie ma funkcji setSourceModel(). Jakiś pomysł?

Hee? Chy ty rozumiesz co chcesz zrobić? Jaki to ma sens?
QSortFilterProxyModel ze swojej natur jest adapotrem do innych modeli danych.
A QSqlTableModel jest adaptorem do bazy danych (baza danych zaadaptowana do QTableView).

Ty masz trzymać wskaźniki do obu modeli. Jak potrzebujesz coś związanego z bazą danych to operujesz an QSqlTableModel, a jak zmienić sortowanie to operujesz na MySortFilterProxyModel. Tak masz to teraz zaprojektowane.
Jak coś się zmieni w QSqlTableModel to MySortFilterProxyModel zaktualizuje się automagicznie.

No ale z MySortFilterProxyModel ani z twojego decodera nie mogę wyciągnąć record() ani value()

0

Mógłby ktoś objaśnić jak należy to wykonać?

1 użytkowników online, w tym zalogowanych: 0, gości: 1