[QTableView + QSqlTableModel] Sortowanie alfabetyczne nie uwzględnia polskich znaków
-
@karlowic Nie stosować.
Wstaw QSortFilterProxyModel pomiędzy QSqlTableModel a widok, ten model służy do stosowania filtrów i właściwego sortowania.Pamiętaj też żeby włączyć setSortLocaleAware(), to powinno załatwić sprawę.
@artwaw Jesteś the best. :)
Oczywiście działa.int column = 2; switch (ui->comboBox->currentIndex()) { case 0: //Nazwisko column = 2; break; case 1: //telefon column = 3; break; case 2: //Imię column= 1; break; } QSqlTableModel *model = new QSqlTableModel; model->setTable("pacjenci"); model->select(); model->setHeaderData(0, Qt::Horizontal, tr("id")); model->setHeaderData(1, Qt::Horizontal, tr("Imię")); model->setHeaderData(2, Qt::Horizontal, tr("Nazwisko")); model->setHeaderData(3, Qt::Horizontal, tr("nr telefonu")); QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel; proxyModel->setSourceModel(model); proxyModel->setSortLocaleAware(true); proxyModel->sort(column, Qt::AscendingOrder); ui->tableView->setModel(proxyModel); ui->tableView->setColumnWidth(0,40); ui->tableView->show();
-
@artwaw Jesteś the best. :)
Oczywiście działa.int column = 2; switch (ui->comboBox->currentIndex()) { case 0: //Nazwisko column = 2; break; case 1: //telefon column = 3; break; case 2: //Imię column= 1; break; } QSqlTableModel *model = new QSqlTableModel; model->setTable("pacjenci"); model->select(); model->setHeaderData(0, Qt::Horizontal, tr("id")); model->setHeaderData(1, Qt::Horizontal, tr("Imię")); model->setHeaderData(2, Qt::Horizontal, tr("Nazwisko")); model->setHeaderData(3, Qt::Horizontal, tr("nr telefonu")); QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel; proxyModel->setSourceModel(model); proxyModel->setSortLocaleAware(true); proxyModel->sort(column, Qt::AscendingOrder); ui->tableView->setModel(proxyModel); ui->tableView->setColumnWidth(0,40); ui->tableView->show();
-
@karlowic Jeszcze uwaga: jeśli nie kasujesz model i proxyModel to masz memory leak dopóki nie ustawisz im rodzica przy new.
To drugie znakomicie automatyzuje proces, więc np.
new QSqlTableModel(this);
byłoby wskazane.@artwaw Do tej pory ustawiałem rodzica przy new tylko dla podrzędnego okna w programie.
A w takim przypadku też warto wpisywać pisać QLabel(this):
if(!mydb.open()) { no_redy = new QLabel(this); no_redy->setText("No ready"); ui->statusBar->addWidget(no_redy); } else { redy = new QLabel(this); redy->setText("Ready"); ui->statusBar->addWidget(redy); refresh(); }
bo tego nie robiłem wcześniej?
-
@artwaw Do tej pory ustawiałem rodzica przy new tylko dla podrzędnego okna w programie.
A w takim przypadku też warto wpisywać pisać QLabel(this):
if(!mydb.open()) { no_redy = new QLabel(this); no_redy->setText("No ready"); ui->statusBar->addWidget(no_redy); } else { redy = new QLabel(this); redy->setText("Ready"); ui->statusBar->addWidget(redy); refresh(); }
bo tego nie robiłem wcześniej?
@karlowic To zależy. Popatrz tutaj: https://doc.qt.io/qt-5/objecttrees.html
Generalnie jeśli obiekt ma rodzica to zostanie prawidłowo usunięty kiedy zostanie usunięty rodzic. Jeśli dodajesz obiekt to UI najprawdopodobniej zachodzi reparenting, więc nie mam problemu - ale warto sprawdzić dokumentację gdyż są wyjątki.
W przypadku obiektów niewidokowych sprawa jest nieco bardziej skomplikowana, bo reparenting zdarza się siłą rzeczy rzadziej. Ja dodaję instancję której członkiem jest model (this) jako parent, bo nie muszę się wtedy martwić czy
delete model;
, czymodel->deleteLater();
, czy nie usunę zbyt wcześnie, czy jakiś edge case nie wywali mi segfaulta. -
@karlowic To zależy. Popatrz tutaj: https://doc.qt.io/qt-5/objecttrees.html
Generalnie jeśli obiekt ma rodzica to zostanie prawidłowo usunięty kiedy zostanie usunięty rodzic. Jeśli dodajesz obiekt to UI najprawdopodobniej zachodzi reparenting, więc nie mam problemu - ale warto sprawdzić dokumentację gdyż są wyjątki.
W przypadku obiektów niewidokowych sprawa jest nieco bardziej skomplikowana, bo reparenting zdarza się siłą rzeczy rzadziej. Ja dodaję instancję której członkiem jest model (this) jako parent, bo nie muszę się wtedy martwić czy
delete model;
, czymodel->deleteLater();
, czy nie usunę zbyt wcześnie, czy jakiś edge case nie wywali mi segfaulta. -
@artwaw Widgety w UI dziedziczą się automatycznie - to rozumiem, :) ale kiedy dodaję QLabel dodatkowo (czyli nie jest to ui->label), czy też ma ustalonego rodzica czy muszę go ustalić jak w/w przykładzie?
@karlowic
void QStatusBar::addWidget(QWidget *widget, int stretch = 0)
Adds the given widget to this status bar, reparenting the widget if it isn't already a child of this QStatusBar object.
W tym wypadku nie musisz, bo zachodzi reparenting. Ale nie zawsze zachodzi, szczególnie poza UI.
Moją uwagę na początku przykuło że konstruujesz modele bez rodzica.
-
@karlowic
void QStatusBar::addWidget(QWidget *widget, int stretch = 0)
Adds the given widget to this status bar, reparenting the widget if it isn't already a child of this QStatusBar object.
W tym wypadku nie musisz, bo zachodzi reparenting. Ale nie zawsze zachodzi, szczególnie poza UI.
Moją uwagę na początku przykuło że konstruujesz modele bez rodzica.
-
@karlowic Nie stosować.
Wstaw QSortFilterProxyModel pomiędzy QSqlTableModel a widok, ten model służy do stosowania filtrów i właściwego sortowania.Pamiętaj też żeby włączyć setSortLocaleAware(), to powinno załatwić sprawę.
@artwaw @karlowic Sposób sortowania musi być ustawiony w źródłowej bazie danych i tam musi być dokonane sortowanie, ani nie w kliencie, modelu czy też używając QSortFilterProxyModel . Powód: Aby dokonać sortowania klient musi załadować wszystkie rekordy z bazy danych. Przy kilku to nie problem, ale przy kilku milionach to problem wielki.
-
@artwaw @karlowic Sposób sortowania musi być ustawiony w źródłowej bazie danych i tam musi być dokonane sortowanie, ani nie w kliencie, modelu czy też używając QSortFilterProxyModel . Powód: Aby dokonać sortowania klient musi załadować wszystkie rekordy z bazy danych. Przy kilku to nie problem, ale przy kilku milionach to problem wielki.
-
@artwaw @karlowic Sposób sortowania musi być ustawiony w źródłowej bazie danych i tam musi być dokonane sortowanie, ani nie w kliencie, modelu czy też używając QSortFilterProxyModel . Powód: Aby dokonać sortowania klient musi załadować wszystkie rekordy z bazy danych. Przy kilku to nie problem, ale przy kilku milionach to problem wielki.
-
@rykomick "Sposób sortowania musi być ustawiony w źródłowej bazie danych i tam musi być dokonane sortowanie"
Baza danych to Sqlite. Proszę podać sposób sortowania znaków diakrytycznych w tej bazie, jeśli to możliwe.