Zaznaczenie w QSqlTableModel na QTableView

Odpowiedz Nowy wątek
2019-03-14 20:31
0

Witam, mam problem, u mnie w aplikacji jest funkcja edit przez którą edytuję się pewien obiekt. Wszystko działało na podstawie zaznaczenia w TableView i przenoszenia to do modela jako w sumie ten sam rekord przez id,
dopóki nie dodałem do programu możliwość sortowania w w QTableViewie :( teraz niestety wybiera mi rekord inny niż jest zaznaczony, myślałem długo i nie mam pomysłu jak to rozwiązać.

void Supplies_menu::on_btnedit_clicked()
{

    ///QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();
    //  ui->tableView->setSortingEnabled(true);
    if(ui->tableView->selectionModel()->hasSelection())
    {
        QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();

        if (index.isValid())
        {
            int selectedRow;
            selectedRow = index.row();
            Adding *add = new Adding(selectedRow,this);
            add->setModal(true);
            add->database_open();
            add->exec();
            table_display();
        }

        else {QMessageBox::critical(this,"error","error");}

    }
    else {
        QMessageBox::information(this,"Selection","You haven't selected any index");
    }
}

void Supplies_menu::on_btndel_clicked()
{
    if(ui->tableView->selectionModel()->hasSelection())
    {
        QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();

        if (index.isValid())
        {
            ////////////////////WPISZ TU DIALOG czxy jest siur
            int row = index.row();
            Adding *add = new Adding(row,this);
            add->database_open();
            add->database_delete();
            table_display();
        }
        else {
            QMessageBox::warning(this,"Selected Index","Your selection is wrong. Try again");
        }
    }
    else {
        QMessageBox::information(this,"Selection","You haven't selected any index");
    }
}
void Adding::database_edit()
{
    database_open();
    if(db.open())
    {
           query.prepare("SELECT * FROM produkty");
        MySqlTableModel *model = new  MySqlTableModel(this,db);
        query.exec();
        model->wywSetQuery(query);
        nm = model->record(IdInView).value("name").toString();
        nt = model->record(IdInView).value("notes").toString();
        QString Kc = model->record(IdInView).value("kcal").toString();
        QString Car = model->record(IdInView).value("carbonates").toString();
        QString Pro = model->record(IdInView).value("proteins").toString();
        QString Fa = model->record(IdInView).value("fats").toString();
        QString Wei = model->record(IdInView).value("weight").toString();
        dat = model->record(IdInView).value("date").toDate();
        iconT = model->record(IdInView).value("img").toByteArray();
        Type = model->record(IdInView).value("type").toString();
        IdInBase = model->record(IdInView).value("productid").toInt();

        ui->lnname->setText(nm);
        ui->lnnotes->setText(nt);
        ui->lnkcal->setText(Kc);
        ui->lncarbonates->setText(Car);
        ui->lnproteins->setText(Pro);
        ui->lnfats->setText(Fa);
        ui->lnweight->setText(Wei);

        if(Type=="1")
        {
            ui->btn1->setVisible(true);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(false);
        }
        else if(Type=="2")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(true);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(false);
        }
        else if(Type=="3")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(true);
            ui->btn4->setVisible(false);
        }
        else if(Type=="4")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(true);
        }

        QImage image; image.loadFromData(iconT);
        ui->icon->setPixmap(QPixmap::fromImage(image));

        //img.loadFromData(Icon);
        // ui->icon->setPixmap(QPixmap::fromImage(img));

        // QVariant currentIcon = model->data(model->index(id,2),0);
        //  QByteArray bytes = currentIcon.toByteArray();

    }
    else QMessageBox::warning(this,"Connecting","Database conection failed!");
}

Tam potem jest dodawanie do database itd spokojnie ;)


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn
Od razu zaznaczam że ledwo ja ogarniam co się w tym kodzie dzieje, bo go pisałem, wiem że jest masa redundancji, nieprawidłowych nazw czy zbędnego kodu ale nvm to pierwszy program, potem się poprawię ^^ - Xezolpl 2019-03-14 20:32

Pozostało 580 znaków

2019-03-15 16:19
0

I jeszcze jedno pytanie mi się nasuwa dało by się aby domyślnie po kliknięciu na header kolumny w tableviewie był on nie rosnący a malejący za pierwszym kliknięciem?


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn

Pozostało 580 znaków

2019-03-15 18:30
1

Pierwszy z brzegu wynik w Google

Reimplementujesz w swoim modelu funkcję headerData i ustawiasz tryb sortowania dla odpowiedniej kolumny poprzez role Qt::InitialSortOrderRole

Nie ogarniam, nie działa... przecież jeżeli mam sorting przez viewa to co da na modelu? - Xezolpl 2019-03-16 11:50
Bo jak zajrzysz w źródła Qt to wywołanie QTableView::sortByColumn to tak naprawdę wywołanie model->sort() ;) - tajny_agent 2019-03-16 16:43

Pozostało 580 znaków

2019-03-15 20:07
2

E tam reimplementuje headerData - starczy wywołać QTableView::setSortingEnabled()


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2019-03-15 20:16
2

A co do zaznaczenia tabeli, toć w innym wątku klarowałem - selectionModel()->selectedRows(), i tabeli pokazującej nastawić setSelectionBehavior(QAbstractItemView::SelectRows), i setSelectionMode(QAbstractItemView::SingleSelection), a jak wyciągniesz numer wiersza to użyć QSqlRecordu. Tym sposobem czy posortowane, czy nie posortowane otrzymasz rzeczywisty numer wiersza do zabawy.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2019-03-16 06:00
1
MasterBLB napisał(a):

E tam reimplementuje headerData - starczy wywołać QTableView::setSortingEnabled()

Tak, ale domyślnie sortowanie jest ustawione na Qt::AscendingOrder, a OP chce żeby było Qt::DescendingOrder.
Czyli albo musi wywołać dodatkowo sortByColumn(), albo reimplementować w modelu headerData().

Pozostało 580 znaków

2019-03-16 11:52
2

Jak sobie setSortingEnabled() włączy na tabeli to już będzie mógł wyklikać na nagłówku w jakiej kolejności ma być posortowane. Ale jest inny dzynks, na dzień dobry sortowanie jest robione na pierwszej kolumnie, jak autor chce aby początkowe sortowanie używało innej niż pierwsza to już bez QTableView::sortByColumn() faktycznie się nie obędzie.

EDYTKA:
setSortingEnabled() włącza możliwość sortowania poprzez kliknięcie nagłówka, domyślnie włącza sortowanie na 1 kolumnie,i kolejność DESC.
sortByColumn() pozwala posortować jakąś kolumnę według podanej kolejności, ale tylko z poziomu kodu programu - użytkownik nie może sobie klikać.

Czyli tak, potrzebujesz Bracie po kolei:

  • włączyć setSortingEnabled()
  • dać sortByColumn(0, ASC) -> dzięki temu jak kliknie nagłówek po raz pierwszy będzie kolejność DESC.
  • dać sortByColumn(1, DESC) -> jak wyżej, i to będzie stan początkowy tabeli.

O taki efekt ci chodzi?


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 3x, ostatnio: MasterBLB, 2019-03-16 12:04
No tak, tak mam wszystko jest git, tylko chcę żeby nie musiał wyklikiwać tylko np w kolumnie pierwszej już za pierwszym kliknięciem było DESC a np. 2 drugiej było ASC bo są tam alfabetycznie nazwy. - Xezolpl 2019-03-16 11:54

Pozostało 580 znaków

2019-03-16 12:11
0
MasterBLB napisał(a):

Jak sobie setSortingEnabled() włączy na tabeli to już będzie mógł wyklikać na nagłówku w jakiej kolejności ma być posortowane. Ale jest inny dzynks, na dzień dobry sortowanie jest robione na pierwszej kolumnie, jak autor chce aby początkowe sortowanie używało innej niż pierwsza to już bez QTableView::sortByColumn() faktycznie się nie obędzie.

EDYTKA:
setSortingEnabled() włącza możliwość sortowania poprzez kliknięcie nagłówka, domyślnie włącza sortowanie na 1 kolumnie,i kolejność DESC.
sortByColumn() pozwala posortować jakąś kolumnę według podanej kolejności, ale tylko z poziomu kodu programu - użytkownik nie może sobie klikać.

Czyli tak, potrzebujesz Bracie po kolei:

  • włączyć setSortingEnabled()
  • dać sortByColumn(0, ASC) -> dzięki temu jak kliknie nagłówek po raz pierwszy będzie kolejność DESC.
  • dać sortByColumn(1, DESC) -> jak wyżej, i to będzie stan początkowy tabeli.

O taki efekt ci chodzi?

Właśnie nie, liczyłem na to żeby domyślnie jak user kliknie na header jakiejś kolumny mu weszło na desc (czy tam na asc w drugiej) żeby mógł sobie klikać. Bo tak to mam na razie, może sobie klikać oraz zaczyna się tabela wyświetlać posortowana wg kolumny 8 i DESC.
Czyli zamierzany przeze mnie efekt jest nieosiągalny?


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn

Pozostało 580 znaków

2019-03-16 12:23
0
MasterBLB napisał(a):

A co do zaznaczenia tabeli, toć w innym wątku klarowałem - selectionModel()->selectedRows(), i tabeli pokazującej nastawić setSelectionBehavior(QAbstractItemView::SelectRows), i setSelectionMode(QAbstractItemView::SingleSelection), a jak wyciągniesz numer wiersza to użyć QSqlRecordu. Tym sposobem czy posortowane, czy nie posortowane otrzymasz rzeczywisty numer wiersza do zabawy.

Nie do końca rozumiem, mam numer rekordu w tableviewie który jest już posortowany czyli nie pokrywa się on z numerem w bazie danych więc dostaje przez to potem do edycji czy usunięcia inny obiekt niż zaznaczyłem w tableviewie. Jak za pomocą QSqlRecourdu?


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn

Pozostało 580 znaków

2019-03-16 12:28
1

Pewnie osiągalny, ale swoje zamiary opisujesz ciut niejasno. No nic, skoro i tak reimplementujesz model do tej tabeli możesz użyć czegoś takiego:

QVariant MyModel::headerData(int section, Qt::Orientation orientation, role) const 
{
    if (role == Qt::InitialSortOrderRole) 
    {
        // use section, orientation, ...
        return QVariant::fromValue(Qt::DescendingOrder); // or maybe Ascending
    }
    return ModelZJakiegoDziedziczysz::headerData(section, orientation, role);
} 

jeśli to zastosujesz, to wtedy bez sortByColumn()


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
ale to się tyczy modelu a nie tableViewa, który user klika na headerze, jeśli dobrze myślę, w każdym razie nie działa. - Xezolpl 2019-03-16 12:33
Zgadza się. Ale każdy TableView opiera się na jakimś modelu danych, co nie? Ty masz jakiś pochodzący od QSqlTableModel z własnymi przeróbkami - dodaj zatem do niego powyższą. - MasterBLB 2019-03-16 12:41
No tak, próbowałem już wcześniej ale nadal nie działało :/ - Xezolpl 2019-03-16 12:42
Daj posta z kodami źródłowymi - używanego modelu, oraz gdzie tworzysz jego instancję i podpinasz pod używany TableView - MasterBLB 2019-03-16 13:16

Pozostało 580 znaków

2019-03-16 12:31
1
Xezolpl napisał(a):

Nie do końca rozumiem, mam numer rekordu w tableviewie który jest już posortowany czyli nie pokrywa się on z numerem w bazie danych więc dostaje przez to potem do edycji czy usunięcia inny obiekt niż zaznaczyłem w tableviewie. Jak za pomocą QSqlRecourdu?

A tak - QSqlRecord QSqlTableModel::record(int row) const. Za row podstawiasz to, co otrzymałeś z selectionModelu, QSqlRecord z kolei zagwarantuje powiązanie z rzeczywistym wierszem jaki siedzi w bazie danych.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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