Qt - QSqlQueryModel - czy dobrze myślę, że ta funkcja coś zwróci

0

Chcę zapytać o klasę QSqlQueryModel
w której jest funkcja
void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())
pytanie jest takie
czy jak użyję powyższej funkcji, to czy powinienem spodziewać się, że następna funkcja QSqlQuery query() const która też jest w tej samej klasie zwróci mi rekord który istnieje w bazie ?

To ogólne pytanie ma dać mi odpowiedź czy dobrze rozumiem, że to działa tak jak opisałem wyżej ?

0

Coś nie jasne napisano w dokumentacji?
https://doc.qt.io/qt-6/qsqlquerymodel.html

1

Zależy co rozumiesz przez rekord, który istnieje w bazie - czy robiąc select 1234; i otrzymując 1234, otrzymałeś rekord, który istnieje w bazie?

0

@_13th_Dragon:

QSqlQuery to nie rekord to wynik całego zapytania które nie koniecznie będzie select ....

czyli jednak dobrze się spodziewam, że w obrębie klasy QSqlQueryModel jak wykonam funkcję setQuery to funkcja query powinna mi zwrócić wynik całego zapytania.

0

@_13th_Dragon:

A co nie jasne w dokumentacji https://doc.qt.io/qt-6/qsqlquery.html że musisz dopytywać?

dobra, doszedłem gdzie miałem problem, szkoda, że dokumentacja trochę wprowadza w błąd

zrobiłem sobie dziedziczenie klasy QSqlQueryModel czyli w dużym uproszczeniu kod wygląda tak:

MyModel : public QSqlQueryModel
{
public:
 jakieś tam funkcje
};
MyModel::MyModel()
{
  QString queryStr="SELECT * FROM tDane";
  
  this->setQuery(queryStr, *dbConnect); //tutaj ustawiam zapytanie i spodziewam się wykonania tego zapytania

  while(this->query().next()){
        qDebug()<<this->query().record().value(1).toString(); //na podstawie powyższego zapytania powinno zwrócić wynik
        //całego zapytania, ale go nie ma

  }
}

i teraz tak, w dokumentacji odnośnie funkcji void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase()) pisze tak -> Executes the query (...) czyli że wykonuje zapytanie. Więc spodziewam się, że jak użyję tej funkcji i jako argument przekażę zapytanie i adres otwartej instancji bazy, to ta funkcja gdzieś tam w tle powinna wykonać to zapytanie i wynik powinien gdzieś tam sobie czekać w pamięci na wyświetlenie w momencie gdy użyję odpowiedniej funkcji czyli w tym przypadku query ale tak nie jest.

Więc, żeby zwróciło mi wynik zapytania, to trzeba wywołać funkcję exec() znajdującą się w klasie QSqlQuery czyli trzeba zrobić coś takiego

MyModel::MyModel()
{
  QString queryStr="SELECT * FROM tDane";
  
  this->setQuery(queryStr, *dbConnect); //tutaj ustawiam zapytanie i spodziewam się wykonania tego zapytania

  query->exec(); //tego brakowało i jak to dodałem, to od razu poniżej otrzymałem wynik zapytania
  
  while(this->query().next()){
        qDebug()<<this->query().record().value(1).toString(); //po dodaniu funkcji exec() są wyniki
  }
}

jedno niedomówienie, a tyle pierdzielenia się aby to zadziałało...

0

Znowu dziedziczenie? Po kiego?
Poza tym QSqlQueryModel nie przeznaczony do ręcznego pobierania wyniku (do tego jest QSqlQuery) Model po to aby go podpiąć pod listę, tablicę, combo itp.
Czyli używasz mikroskop elektronowy do wbijania gwoździ i skarżysz się że w dokumentacji nie napisano jak to robić :D

0

treść posta to bzdura, zostawiam bo ciężko przekreślić


Czytamy jakąś inną dokumentację? Tam nie ma nic o wykonywaniu query

https://doc.qt.io/qt-6/qsqlquerymodel.html#setQuery

Resets the model and sets the data provider to be the given query.

https://doc.qt.io/qt-6/qsqlquerymodel.html#query

Returns the QSqlQuery associated with this model.

Te metody to setter i getter kwerendy - co jest zgodne z konwencją Qt (setX() i x() to setter/getter), którego się uczysz już dobre kilka lat.

0

i jeszcze jedno - kiedy robić dziedziczenie, a kiedy go nie robić ? Skąd mam to wiedzieć ? — zkubinski 38 minut temu

W odniesieniu do styku z jakimś dużym frameworkiem? Nigdy, chyba że API specjalnie to akcentuje, np udokumentowana jest klasa abstrakcyjna.
Po drugie jeśli są interfejsy, które trzeba zaimplementować, ale to takie "inne dziedziczenie"

We frameworku mogą zachodzić naprawdę dziwne rzeczy, np jest fabryka, która tworzy obiekty ... no co, jak odziedziczysz to wytworzy twój ? Nie, nigdy ...
Wiele fw GUI wręcz zakazuje dziedziczenia w dokumentacji, próbują to blokować jakimiś final'ami albo stosujac tricki programistyczne (Java SWT)

We własnym kodzie bardzo rzadko, ale tak jak tutaj, niemal nigdy.

0

no dobra, przy okazji tego wątku mam jeszcze jedno pytanie, może mi ktoś z was dobrze to wyjaśni

mam taki kod (w sumie powtórzę to co już jest wyżej) co do dziedziczenia, to wiem, żeby już nie dziedziczyć, no chyba, że zrobię swoją klasę, która uzupełni i istniejącą o jakąś funkcjonalność.

no ale do rzeczy.

MyModel : public QSqlQueryModel
{
public:
 jakieś tam funkcje
};
MyModel::MyModel()
{
  QString queryStr="SELECT * FROM tDane";
  
  this->setQuery(queryStr, *dbConnect); //tutaj ustawiam zapytanie i spodziewam się wykonania tego zapytania

  //this->query->exec(); //załóżmy, że tej funkcji nie użyłem

  this->record(1).value(1).toString(); //dlaczego ta funkcja wyświetla mi wynik ?
  this->record().value(1).toString(); //a ten już nie ?

  //również chciałbym zadać pytanie dlaczego w pętli zadziała poniższy zapis ?

  this->query().record().value(1).toString();
}

wiem, że obie funkcje record() różnią się przyjmowanym argumentem ale czemu w pętli działa ten bez argumentu, a jak nie podam go w pętli to nie zadziała ?

@ZrobieDobrze:

przykład

chociażby np w w tym miejscu i tutaj i jeszcze kilka miejsc by się znalazło, aha i tą klasę też można dziedziczyć

1
zkubinski napisał(a):
  this->record(1).value(1).toString(); //dlaczego ta funkcja wyświetla mi wynik ?

Zacznij czytać dokumentację!
Czemu miał by nie wyświetlać?

zkubinski napisał(a):

this->record().value(1).toString(); //a ten już nie ?

Zacznij czytać dokumentację!

QSqlRecord QSqlQueryModel::record() const
This is an overloaded function.
Returns an empty record containing information about the fields of the current query.
If the model is not initialized, an empty record will be returned.

Którego słowa nie rozumiesz?

zkubinski napisał(a):

this->query().record().value(1).toString(); //również chciałbym zadać pytanie dlaczego w pętli zadziała poniższy zapis ?

Zacznij czytać dokumentację nie zadziała w każdej pętli, bo nie o pętle chodzi.

0

Podejrzewam że next() może zmieniać coś w stanie wewnętrznym obiektu.

0

mam jeszcze jedno pytanie

patrzę sobie na przykład i na funkcję data gdzie wewnątrz tej funkcji jest nastepna funkcja data
zakomentowanie QVariant value = QSqlQueryModel::data(index, role); nie pokazuje żadnych wyników. Dlaczego ? Czy wyjaśni mi ktoś o co chodzi z tą funkcją ?

0

Klasa CustomSqlModel implementuje własną wersję funkcji data(...). Ta funkcja jednocześnie korzysta z implementacji data(...), z klasy nadrzędnej.

0
zkubinski napisał(a):

mam jeszcze jedno pytanie

patrzę sobie na przykład i na funkcję data gdzie wewnątrz tej funkcji jest nastepna funkcja data
zakomentowanie QVariant value = QSqlQueryModel::data(index, role); nie pokazuje żadnych wyników. Dlaczego ? Czy wyjaśni mi ktoś o co chodzi z tą funkcją ?

Przychodzi pora przeczytać podręcznik jęzuka

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