Podpięcie Query do QSqlTableModel

0

Witam mam sobie taki oto kod, mam ten model, lecz nie mogę użyć setQuery do niego gdyż pisze że jest prodected fukcją QSqlTableModel. Ma ktoś pomysł? Ogólnie ma się wyświetlać tabela z bazy danych muszę jakoś potem znaleźć, wyjąć który rekord zaznaczył user do edycji.

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



    /// STYLIZACJA TABELI I WKLADANIE BAZY DANYCH

    QSqlQuery *query2= new QSqlQuery();
    query2->prepare("SELECT * FROM produkty ORDER BY weight");
    query2->exec();
    model->setTable("Products");
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    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

Jeśli QSqlTableModel::setFilter() nie pomoże to zawsze masz opcję odziedziczyć QSqlTableModel i dopisać mu metodę publiczną która wywoła to protected QSqlTableModel::setQuery()

Jak chcesz znaleźć,który rekord w bazie został zaznaczony do edycji, to tak:

  • QTableView::selectionModel() da ci QItemSelectionModel
  • tenże QItemSelectionModel to pozwala na totalną rozpustę - selectedIndexes(), selectedRows(), selectedColumns(), do wyboru do koloru. Tobie chyba najbardziej się przyda selectedRows()
  • z QItemSelectionModel::selectedRows() wyciągasz sobie wiersz jaki jest zaznaczony
  • następnie tego wiersza używasz aby dostać QSqlRecord (będący jakby skrótem/linkiem do wiersza w tabeli bazy danych) poprzez wywołanie QSqlTableModel::record(row)
  • ów QSqlRecord edytujesz/czytasz, i zmiany w nim będą przeniesione do bazy danych.
0

Tylko nie wiem zbytnio jak mam to odziedziczyć, z QSqlQueryModel czy jak? Już w konstuktorze odziedziczyć? Coś takiego (nie działa bo nadal funkcja protected)?

QSqlQueryModel *mod = new QSqlQueryModel();
    QSqlQuery *query2= new QSqlQuery();
    query2->prepare("SELECT * FROM produkty ORDER BY weight");
    query2->exec();
    QSqlTableModel *model = new QSqlTableModel(mod,db2);
    model->setQuery(*query2);
2

Potrzebujesz zrobić taką sztuczkę:

class MySqlTableModel : public QSqlTableModel //QSqlQueryModel nie pozwala edytować, więc trzeba użyć tego
{
public:
//konstruktor i destruktor - to we własnym zakresie pisz Bracie, ważne abyś pamiętał o tym przekazaniu bazy danych na której ma pomykać

   //teraz sztuczka:
   void wywolujSetQueryTyUju(const QSqlQuery &query)
   {
      setQuery(query);//setQuery() jest protected, ale wywołujesz je wewnątrz metody klasy która odziedziczyła QSqlTableModel - dla tej klasy metoda setQuery() jest traktowana jak publiczna.
   }
};

Mam jednak pytanie - czemu się tak upierasz z tym wykonaniem select * from produkty order by weight? Toć QTableView z sortowaniem sam sobie z tym poradzi.

2

@Xezolpl: QSqlTableModel::setSort

Czyli to by wyglądało jakoś tak:

auto model = new QSqlTableModel(this,db);
model->setTable("produkty");
model->setSort(3, Qt::AscendingOrder); // zamiast '3' podaj indeks kolumny 'weight'
model->select();
tableView->setModel(model);

Sposób dobierania się do rekordu wskazanego przez użytkownika już opisał @MasterBLB.

0
MasterBLB napisał(a):

Jeśli QSqlTableModel::setFilter() nie pomoże to zawsze masz opcję odziedziczyć QSqlTableModel i dopisać mu metodę publiczną która wywoła to protected QSqlTableModel::setQuery()

Jak chcesz znaleźć,który rekord w bazie został zaznaczony do edycji, to tak:

  • QTableView::selectionModel() da ci QItemSelectionModel
  • tenże QItemSelectionModel to pozwala na totalną rozpustę - selectedIndexes(), selectedRows(), selectedColumns(), do wyboru do koloru. Tobie chyba najbardziej się przyda selectedRows()
  • z QItemSelectionModel::selectedRows() wyciągasz sobie wiersz jaki jest zaznaczony
  • następnie tego wiersza używasz aby dostać QSqlRecord (będący jakby skrótem/linkiem do wiersza w tabeli bazy danych) poprzez wywołanie QSqlTableModel::record(row)
  • ów QSqlRecord edytujesz/czytasz, i zmiany w nim będą przeniesione do bazy danych.

Dziękuję bardzo chyba działa, ale jeszcze nie skończyłem funkcji edytowania całej, tak to ma mniej więcej wyglądać?

QModelIndex x = ui->tableView->selectionModel()->selectedRows().first();
   /*INT*/ selectedRow = x.row();

Mam jeszcze pytanie jak coś takiego mam przenieść do headera jako pointer żeby funkcje potem tak samo działały bo jakbym nie próbował to i tak mi errora wywala? Czy lepiej nie przenosić?

MySqlTableModel *model = new MySqlTableModel(this,db2);
1

Mimo wszystko warto sprawdzić czy selectedRows nie jest puste.

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