Qt - model/widok - czy da się zawężyć tabelę do wpisywanych fraz

0

jeszcze raz odgrzewam wątek pt. model/widok ale tym razem z innym problemem. Zrobiłem sobie wyszukiwarkę za pomocą QCompleter i pytanie jak w tytule

Czy ktoś z was wiedziałby jak wykonać zawężanie tablicy z danymi podczas wpisywania ich do pola ?

kod jest na GitLab-ie

0

Czemu przepisujesz historię? Dodawaj nowe commit-y.
Też ta dziwna nazwa branch-a.

Swoja drogą wklejaj istotny kod do pytania. Udostępnianie ropzytorium przydaje się, jak ktoś potrzebuje zbudować twój kod, ale najczęściej wystarczy zobaczyć fragmenty i poprawić. Luepiej jak je widać od razu w pytaniu i nie trzeba przeszukiwać innej strony.

Swoją drogą dałem ci dobry kod, a ty go popsuleś.

diff --git a/mymodel.cpp b/mymodel.cpp
index 39080aa..d7ae7a3 100644
--- a/mymodel.cpp
+++ b/mymodel.cpp
@@ -27,7 +27,7 @@ QVariant MyModel::data(const QModelIndex &index, int role) const
         return QVariant();
     }
 
-    if(role == Qt::DisplayRole){
+    if(role == Qt::DisplayRole || role == Qt::EditRole){
         if(index.column()==0)
         return tablica.at(index.row());
     }
@@ -46,7 +46,7 @@ bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
         int x = value.toInt(&ok);
         if(ok){
             tablica[index.row()]=x;
-            emit dataChanged(index,index,QVector<int>{Qt::EditRole});
+            emit dataChanged(index,index,QVector<int>{Qt::DisplayRole, Qt::EditRole});
             return true;
         }
     }
@@ -78,7 +78,7 @@ Qt::ItemFlags MyModel::flags(const QModelIndex &index) const
 {
     Qt::ItemFlags flag = QAbstractItemModel::flags(index);
 
-    if(index.column()==0 || index.column()==1){
+    if(index.column()==0){
         flag |= Qt::ItemIsEditable;
         return flag;
     }

|| role == Qt::EditRole - zobacz co się stanie jak zaczynasz edycję
QVector<int>{Qt::DisplayRole, Qt::EditRole} - efekt tego widać, jak jest więcej niż jeden widok pokazujący ten sam model.
co z tą drugą kolumną? Co ma zawierać? Co ma się dziać jak jest edytowana?

Co do pytania:
QSortFilterProxyModel Class | Qt Core 5.15.9

Filtering

In addition to sorting, QSortFilterProxyModel can be used to hide items that do not match a certain filter. The filter is specified using a QRegExp object and is applied to the filterRole() (Qt::DisplayRole by default) of each item, for a given column. The QRegExp object can be used to match a regular expression, a wildcard pattern, or a fixed string. For example:

       proxyModel->setFilterRegExp(QRegExp(".png", Qt::CaseInsensitive,
                                          QRegExp::FixedString));
       proxyModel->setFilterKeyColumn(1);
0

@MarekR22:

Swoją drogą dałem ci dobry kod, a ty go popsuleś.

wiem, ale nie rozumiałem po co jest to Qt::EditRole jak usunąłem Qt::DisplayRole to efekt był dziwny tj. kolumny były puste, a potem jak w coś kliknąłem to pojawiła się zawartość więc ominąłem Qt::EditRole bo wydawało mi się to niepotrzebne skoro wyświetlało się poprawnie - ale obecnie już dodałem obie Role

Czemu przepisujesz historię? Dodawaj nowe commit-y.

chciałem usunąć pliki *.user teraz ich już nie ma i jest tylko plik .gitignore

Swoja drogą wklejaj istotny kod do pytania.

rozumiem, postaram się robić jak trzeba

i mam jedno dodatkowe pytanie, tak przy okazji, popatrz na funkcję, którą mi napisałeś

bool ok=false;
int x=value.toInt(&ok);

nie rozumiem dlaczego konwersja do typu int przyjmuje w argumencie wartość logiczną ? Rozumiem, że w dokumentacji pisze, że ten argument jest po to aby funkcja wiedziała że ma konwertować to typu int ale bez tego argumentu i tak konwertuje do typu int więc nie rozumiem po co jest ta wartość logiczna ?

jeżeli chodzi o pytanie w wątku -> QSortFilterProxyModel to czy mam napisać jakiś model filtrujący ? Czy kawałek kodu który mi podałeś jest wystarczający ?

jeszcze jedno

emit dataChanged(index,index,QVector<int>(Qt::EditRole,Qt::DisplayRole));

w dokumentacji jest

void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())

jak rozumieć const QModelIndex &topLeft i const QModelIndex &bottomRight - lewa, prawa ? O co chodzi ? Bo tak jakoś bez sensu ponazywane

2
zkubinski napisał(a):

i mam jedno dodatkowe pytanie, tak przy okazji, popatrz na funkcję, którą mi napisałeś

bool ok=false;
int x=value.toInt(&ok);

nie rozumiem dlaczego konwersja do typu int przyjmuje w argumencie wartość logiczną ? Rozumiem, że w dokumentacji pisze, że ten argument jest po to aby funkcja wiedziała że ma konwertować to typu int ale bez tego argumentu i tak konwertuje do typu int więc nie rozumiem po co jest ta wartość logiczna ?

Dlatego że trzymasz int. A wartość logiczna wyjaśnia się nazwą zmiennej, a jak to nie pomaga to powinno być jasne jak postarzysz w dokumentację.

zkubinski napisał(a):

jeżeli chodzi o pytanie w wątku -> QSortFilterProxyModel to czy mam napisać jakiś model filtrujący ? Czy kawałek kodu który mi podałeś jest wystarczający ?

Nie masz go "napisać" tylko użyć (nawet nie waż się dziedziczyć po tym). W dokumentacji jest przykład jak. Masz zrobić prawie, że idealne copy paste z dokumentacji.

zkubinski napisał(a):

jeszcze jedno

emit dataChanged(index,index,QVector<int>(Qt::EditRole,Qt::DisplayRole));

w dokumentacji jest

void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())

jak rozumieć const QModelIndex &topLeft i const QModelIndex &bottomRight - lewa, prawa ? O co chodzi ? Bo tak jakoś bez sensu ponazywane

To wyznacza prostokąt tabeli (na podstawie jego rogów), w którym informujesz, że nastąpiły zmiany.
Co do wartości roles ma się znaleźć tam wszystko co po zmianie zawartości danych ma wpływ na to co zwraca MyModel::data(const QModelIndex &index, int role).

Qt ma bardzo fajną dokumentację (dla mnie bardzo zbalansowana pod względem: jest wszystko co potrzebne i nie przygniata szczegółami). Wyrób sobie odruch eksploracji dokumentacji.

0

@MarekR22:

patrzę w dokumentacji na sloty i jest tam slot void setFilterRegularExpression(const QString &pattern)

zrobiłem sobie takiego connecta

QObject::connect(lineEdit, &QLineEdit::textChanged, filterModel, &QSortFilterProxyModel::setFilterRegularExpression);

i kompilator zgłasza, że
No matching member function for call to 'connect' ? O co chodzi, przecież sygnał i slot mają te same argumenty

0

Pewnie chodzi o to: https://stackoverflow.com/a/16795664/1387438
Czyli:

QObject::connect(
    lineEdit, &QLineEdit::textChanged, 
    filterModel, qOverload<const QString &>(&QSortFilterProxyModel::setFilterRegularExpression));
0
MarekR22 napisał(a):

Pewnie chodzi o to: https://stackoverflow.com/a/16795664/1387438
Czyli:

QObject::connect(
    lineEdit, &QLineEdit::textChanged, 
    filterModel, qOverload<const QString &>(&QSortFilterProxyModel::setFilterRegularExpression));

chyba nie, bo kompilator mi mówi że:

Address of overloaded function 'setFilterRegularExpression' does not match required type 'QOverload<const QString &>'

swoją drogą, wyjaśnisz o co chodzi z tym QOverload ? Bo pierwszy raz to widzę

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