QTableView - wybranie zaznaczanego rekordu do kodu.

Odpowiedz Nowy wątek
2019-02-18 17:37

Rejestracja: 1 rok temu

Ostatnio: 3 tygodnie temu

0

Witam,
chcę zrobić opcję edycji wybranego całego rekordu poprzez zaznaczenie go przez użytkownika w tabeli i kliknięcie pushButtona. Jednak natrafiłem na taki problem że nie mam pomysłu jak wyciągnąć akurat z tego zaznaczonego rekordu wartość tam primarykeya z bazy (id) przez które już bym mógł edytować. W razie czego mógłbym to zrobić przez zdeletowanie (z mysqla) danego rekordu, i insert po prostu zamiast update'a ale nadal ten sam problem - jak wziąć wartość tego id, który jest teraz zaznaczony.

void Adding::database_edit()
{
        int id;
        query.prepare("UPDATE produkty (name,notes,kcal,carbonates,proteins,fats,weight,date,img)"
                      " SET VALUES(?,?,?,?,?,?,?,?,?) WHERE productid="+id /* TUTAJ WSTAWIĆ */ );
        query.addBindValue(nm);
        query.addBindValue(nt);
        query.addBindValue(kc);
        query.addBindValue(car);
        query.addBindValue(pro);
        query.addBindValue(fa);
        query.addBindValue(wei);
        query.addBindValue(dat);
        query.addBindValue(icon);
}

///
Czerwony - nazwa, element rekordu którego chcę id (ono stoi 2 kolumny wcześniej (w lewo) tylko jest zhiddenowane)
Niebieski - przycisk wywołujący tą edycję

/Edit:
Jest to w ogóle wykonalne czy myśleć nad innym rozwiązaniem?


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

Pozostało 580 znaków

2019-02-18 18:24

Rejestracja: 14 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Warszawa

2

A na czym opierasz model jaki wyświetlasz w tej tabeli? Bo istnieje coś takiego jak QSqlTableModel, które byłoby do twoich potrzeb przydatne gdyż ma metodę record(int row), która daje QSqlRecord, a z niego to już sobie powyciągasz co chcesz.
Obczaj ponadto QSqlTableModel::editStrategy()


"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 6x, ostatnio: MasterBLB, 2019-02-18 18:28
Kurcze, źle przeczytałem moje to jest w ui tableView a tutaj jest model na QSqlQueryModel. Lecz gdy chcę to zamienić na tablemodel i dać na ten model query to nie mogę bo jest protected ... nie wiem o co chodzi... QSqlTableModel model = new QSqlTableModel(); QSqlQuery query2= new QSqlQuery(); query2->prepare("SELECT FROM produkty ORDER BY weight"); query2->exec(); model->setQuery(query2); ///setQuery is protected member of QSqlTableModel - Xezolpl 2019-02-18 18:41
Zaraz zerknę w Assistanta jak dokładnie się tego QSqlTableModelu używa; na 90% trzeba mu tabelę podać aby działał. - MasterBLB 2019-02-18 18:43

Pozostało 580 znaków

2019-02-18 18:27

Rejestracja: 1 rok temu

Ostatnio: 3 tygodnie temu

0
MasterBLB napisał(a):

A na czym opierasz QAbstractItemModel jaki wyświetlasz w tej tabeli? Bo istnieje coś takiego jak QSqlTableModel, które było do twoich potrzeb przydatne bo ma metodę record(int row) która daje QSqlRecord, a z niego to już sobie powyciągasz co chcesz.

Tak, właśnie na tym to wisi.

void Supplies_menu::table_display()
{
    ////STWORZENIE TABELI
    add.database_close();
    add.database_open();
    add.getDatabase(db2);
    QSqlQueryModel *model = new QSqlQueryModel();

    /// STYLIZACJA TABELI I WKLADANIE BAZY DANYCH

    QSqlQuery *query2= new QSqlQuery();
    query2->prepare("SELECT * FROM produkty ORDER BY weight");
    query2->exec();

    model->setQuery(*query2);
    ui->tableView->setModel(model);
    ui->tableView->hideColumn(0);
    ui->tableView->hideColumn(3);
    ui->tableView->resizeColumnsToContents();
    ui->tableView->setColumnWidth(1,35);
    ui->tableView->setColumnWidth(2,222);
    ui->tableView->setColumnWidth(8,110);
    ui->tableView->setColumnWidth(9,75);
    ui->tableView->resizeRowsToContents();
    add.database_close();

}

„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn
Nieco zedytowałem post, popatrz teraz. - MasterBLB 2019-02-18 18:29

Pozostało 580 znaków

2019-02-18 18:50

Rejestracja: 1 rok temu

Ostatnio: 3 tygodnie temu

0
MasterBLB napisał(a):

A na czym opierasz model jaki wyświetlasz w tej tabeli? Bo istnieje coś takiego jak QSqlTableModel, które byłoby do twoich potrzeb przydatne gdyż ma metodę record(int row), która daje QSqlRecord, a z niego to już sobie powyciągasz co chcesz.
Obczaj ponadto QSqlTableModel::editStrategy()

Coś takiego wymyśliłem niby powinno działać tylko nie ma gdzie podpiąć tego querry.

void Supplies_menu::table_display()
{
    ////STWORZENIE TABELI
    add.database_close();
    add.database_open();
    add.getDatabase(db2);
   // QSqlQueryModel *model = new QSqlQueryModel();
    QSqlTableModel *model = new QSqlTableModel();

    /// STYLIZACJA TABELI I WKLADANIE BAZY DANYCH

    QSqlQuery *query2= new QSqlQuery();
    query2->prepare("SELECT * FROM produkty ORDER BY weight");
    query2->exec();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->setTable("Products");
    model->select();

    ui->tableView->setModel(model);
    ui->tableView->hideColumn(0);
    ui->tableView->hideColumn(3);
    ui->tableView->resizeColumnsToContents();
    ui->tableView->setColumnWidth(1,35);
    ui->tableView->setColumnWidth(2,222);
    ui->tableView->setColumnWidth(8,110);
    ui->tableView->setColumnWidth(9,75);
    ui->tableView->resizeRowsToContents();
    add.database_close();

}

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

Pozostało 580 znaków

2019-02-18 18:52

Rejestracja: 14 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Warszawa

Ok, to tak się tego poprawnie używa:

  • żeby użyć QSqlTableModeltrzeba w konstruktorze przekazać mu bazę danych, na jakiej ma operować - tego widzę nie masz.
  • potem trzeba nastawić tabelę którą ma zobrazować poprzez model->setTable(i tu QString z nazwą tabeli) - to masz.
  • po powyższych czynnościach model można podpiąć do QTableView poprzez setModel() - tego nie masz, albo schowane gdzieś.
    wszystko powyższe jest w Assistancie

Zagadnienie edycji rekordu sprowadza się do znalezienia jaki wiersz należy przesłać do QTableView::record(int row) aby otrzymać właściwy QSqlRecord do edycji. Do znalezienia tegoż wiersza może się przydać QTableView::selectionModel()


"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 1x, ostatnio: MasterBLB, 2019-02-18 18:54
1.ok tą baze danych dodałem a parent jako this, 2.to mam 3. to też mam tylko przez pointery do ui. Tak wszystko zrobione tylko jak właśnie podpiąć to query wywołujące informacje z bazy do tego modelu żeby to wyświetlić? - Xezolpl 2019-02-18 18:57
Daj to jako post, nie komentarz; chyba wiem, co ci pomoże Bracie. - MasterBLB 2019-02-18 18:59
:/ no nic będę dalej kombinował, albo wymyśle inne przedstawienie danych - Xezolpl 2019-02-18 19:14
xD czytać już ze zrozumieniem nie umiem.... przeczytałem "chyba NIE wiem co ci pomoże" .... Już dodaje posta :D - Xezolpl 2019-02-19 06:25
No pal licho, wczoraj dodałem wskazówkę o tym 'setFilter()'. I co, przydało się? - MasterBLB 2019-02-19 07:01

Pozostało 580 znaków

2019-02-18 19:02

Rejestracja: 14 lat temu

Ostatnio: 2 godziny temu

Lokalizacja: Warszawa

2

Jak chcesz zrobić jakieś filtrowanie na tym modelu to obczaj w Assistancie void QSqlTableModel::setFilter(const QString &filter) - ustaw filtr jaki potrzebujesz przed wywołaniem model->select();


"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

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