QTableView - wybranie zaznaczanego rekordu do kodu.

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?

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()

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();

}


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();

}
2

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

  • żeby użyć QSqlTableModel trzeba 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()

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();

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