Qt - QSqlQuery

ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
0

Stworzyłem sobie taki formularz (jest to przykład)

screenshot-20201121195300.png

W jaki sposób mogę sprawić, aby przyciski Poprzedni i Następny wyświetlały rekordy w kontrolkach znajdujących się na formularzu ?
Kod w załączniku


bla
DO
  • Rejestracja:ponad 5 lat
  • Ostatnio:4 miesiące
  • Postów:85
0

Nie wiem dokładnie w czym problem. Możesz się już połączyć z bazą? W kodzie widzę, że masz zapytanie do pobrania danych. Printują Ci się jakieś dane jak je wywołasz z Twojego programu?

ZK
oczywiście, że tak, nie załączyłem tutaj bazy danych bo jest na xampp
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
0

@_dominik:
Kod trochę poprawiłem i znajduje się pod tym linkiem
Baza danych do zaimportowania w xampp znajduje się w załączniku
Nazwa bazy danych jaka jest użyta w tym projekcie to "DBViewPDF"

Gdyby ktoś jeszcze doradził dwie rzeczy

  1. Wiem, że przechowywanie danych z bazy w kontenerze jest bez sensu - ale jak zrobić aby dane były pobierane dynamicznie z bazy do odpowiednich kontrolek ?
  2. no i gdyby ktoś podpowiedział jak poprawić te przyciski poprzedni i następny w taki sposób aby poprawnie pokazywały rekordy

bla
edytowany 1x, ostatnio: zkubinski
DO
  • Rejestracja:ponad 5 lat
  • Ostatnio:4 miesiące
  • Postów:85
0

ad. 1 nie wiem czy to taki zły pomysł. Zwłaszcza jeśli to by miało być tylko read only to może lepiej, dać tylko jedno zapytanie do bazy i w jakieś strukturze buforować wyniki niż odpytywać bazę o każdy rekord. Możesz też poczytać o mvc. Qt bardzo dobrze wspiera to rozwiązanie i w sumie nie musiał byś się martwić o wiele rzeczy. Link

ZK
model widok znam (nie do końca dobrze) ale kojarzę, w modelu/widok układ jest tabelaryczny, a ja tutaj kombinuję ze zrobieniem formularza
DO
Nie tylko, formularze też można tak zrobić
ZK
czyli proponujesz pobierać currentIndex z modelu i przekazywać go do kontrolki ?
DO
Nie, proponuję uzyc dedykowanych narzędzi. W tym przypadku np. QDataWidgetMapper. Ale wszystko opiera się o ilosc danych, bo być może to przerost formy nad treścią. Na pewno jednak takie rozwiązanie będzie bezpieczniejsze i bardziej elastyczne.
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:minuta
  • Postów:305
0

Propozycja:

Kopiuj
    QVector <QString> myStrID;
    QVector <QString> myStrPath;

To zamień sobie na jakąś strukturę, wtedy będziesz miał do pilnowania jeden vector.
Propozycja rozwiązania:
Zrób sobie zmienną np. currentIndex, aby trzymać aktualną pozycję na której jesteś, wtedy pod funkcję, które reagują na sygnały kliknięcia będziesz mógł w łatwy sposób ustawić text w obu kontrolkach, a łapiąc w zakres
0 <= currentIndex < QVector::size() nie wypadniesz z vectora

edytowany 3x, ostatnio: BartoSAS
enedil
off-by-one w zakresie
BartoSAS
faktycznie, dzięki
ZK
j/w -> czyli proponujesz pobierać currentIndex z modelu i przekazywać go do kontrolki ? O to wam chodzi ?
BartoSAS
w zasadzie tak, dodatkowo, gdy ktoś kliknie "wyświetl pdf", to wtedy możesz pod ten guzik podpiąć drugie zapytanie, które już wyciągnie Ci konkretnego pdf-a
ZK
no i tutaj jest problem, bo jeszcze nie zrozumiałem jak używać currentIndex bo to jest z klasy QModelIndex
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:minuta
  • Postów:305
0

no i tutaj jest problem, bo jeszcze nie zrozumiałem jak używać currentIndex bo to jest z klasy QModelIndex

Tutaj można zrobić to "na około" - starsi stażem zrobią to lepiej z QModelIndex, ale ja tutaj postaram się przedstawić obejście.

W mainwindow.h tworzysz int m_currentIndex {0};

Kopiuj

bool MainWindow::BPrev()
{
 if(m_currentIndex != 0)
  {
     m_currentIndex--;
  }
ui->myuiID->setText(myStrID[m_currentIndex]);
}

bool MainWindow::BNext()
{
  if(m_currentIndex < myStrID.size()-1)
 {
   m_currentIndex++;
 }
    ui->myuiID->setText(myStrID[m_currentIndex]);
}

Mam nadzieję, że pomoże Ci dojść ten przykład do rozwiązania problemu.

edytowany 2x, ostatnio: BartoSAS

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.