Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++/QT] Lista wyboru + baza SQLITE

Ostatnio zmodyfikowano 2011-04-11 22:29
Autor Wiadomość
esencee
Temat założony przez niniejszego użytkownika
[C++/QT] Lista wyboru + baza SQLITE
» 2011-04-11 21:27:53
Witam. Piszę pewną aplikację bazodanową (katalog płyt muzycznych) i natknąłem się na problem. Mam listę wyboru (QtComboBox) i okienko z danymi. Idea jest taka, wybieram tytuł płyty z listy, chcę aby pokazywały mi się dane na jej temat.
Oczywiście stworzyłem listę, która pobiera dane z bazy SQLITE:
C/C++
QqlQuery pobieranie;
pobieranie.exec( "SELECT * FROM plyty" );

wybierz = new QComboBox();

while( pobieranie.next() ) {
    wybierz->addItem( pobieranie.value( 2 ).toString() );
   
}

Wszystko działa w porządku.
Stworzyłem też slot, który ma pobierać dane konkretnej płyty z bazy SQLITE:

C/C++
void Dialog::danePlyty( QString id )
{
    QSqlQuery select1;
   
    select1.prepare( "SELECT * FROM plyty WHERE tytul LIKE :id" );
    select1.bindValue( ":id", id );
   
    select1.exec();
   
    while( select1.next() ) {
       
        idDan = select1.value( 0 ).toInt();
        wykonawcaDan = select1.value( 1 ).toString();
        tytulDan = select1.value( 2 ).toString();
        gatunekDan = select1.value( 3 ).toString();
        rokDan = select1.value( 4 ).toString();
       
        qDebug() << idDan << wykonawcaDan << tytulDan << gatunekDan << rokDan;
       
    }
}

Wszystko chciałem połączyć poprzez connect:
C/C++
connect( wybierz, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( danePlyty( QString ) ) );

I pojawił się problem, dane płyty się nie odświeżają.
Gdy uruchomię swoją aplikację, pokazują się dane pierwszej z płyty, gdy chce wybrać np. drugą, dane te się nie zmieniają.

Macie jakieś propozycję? Może źle zbudowałem slot? Może problem jest z connect'em?

Z góry dzięki za każde wskazówki!

edit:
Dodam jeszcze, że gdy wybieram dane z listy, to w konsoli mi się te dane pojawiają, natomiast w aplikacji okienkowej nie. Dodam screena dla zobrazowania problemu: http://i.imgur.com/zjOYK.jpg
P-30631
DejaVu
» 2011-04-11 21:51:27
Użyj debuggera - a jak nie umiesz to wypisz sobie komunikat błędu albo chociażby liczbę zwróconych rekordów. Nie wiem jak jest w QT ale być może aktualizację listy trzeba robić poprzez wywołanie dodatkowej metody np. populate() aby zawartość została odświeżona.
P-30633
esencee
Temat założony przez niniejszego użytkownika
» 2011-04-11 21:54:16
Cześć DejaVu. Program nie zwraca żadnego błędu. Jeszcze lepiej - wyświetla poprawne dane, ale w konsoli! W okienku odświeżyć się nie chcę. Podam screen dla zobrazowania problemu: http://i.imgur.com/zjOYK.jpg

Zaraz pokombinuje z metodą populate()

P-30634
DejaVu
» 2011-04-11 22:03:45
Jeżeli w konsoli dane Ci się pobierają to problem leży w warstwie prezentacji danych, czyli w liście QT :)
P-30637
esencee
Temat założony przez niniejszego użytkownika
» 2011-04-11 22:06:26
Tzn? Mógłbyś mnie naprowadzić jakimiś konkretniejszymi wskazówkami?
P-30638
malan
» 2011-04-11 22:10:22
To, że w metodzie
Dane::danePlyty
 przypiszesz nowe wartości poszczególnym zmiennym nie oznacza, że kontroli odświeżą się same. Stwórz sobie np. metodę:
C/C++
void Dane::update()
{
    // Nie znam QT.
    kontrolka2.SetText( wykonawcaDan );
    kontrolka1.SetText( tytulDan );
    //...itd.
}
...i wywołaj:
C/C++
void Dialog::danePlyty( QString id )
{
    //...
   
    // Czy ta pętla jest potrzebna?
    // Przecież i tak baza powinna zwrócić jeden rekord (teoretycznie)...
    while( select1.next() ) {
       
        idDan = select1.value( 0 ).toInt();
        wykonawcaDan = select1.value( 1 ).toString();
        tytulDan = select1.value( 2 ).toString();
        gatunekDan = select1.value( 3 ).toString();
        rokDan = select1.value( 4 ).toString();
        update();
       
        qDebug() << idDan << wykonawcaDan << tytulDan << gatunekDan << rokDan;
       
    }
}
P-30639
DejaVu
» 2011-04-11 22:11:44
A combobox can be populated using the insert functions, insertItem() and insertItems() for example. Items can be changed with setItemText(). An item can be removed with removeItem() and all items can be removed with clear(). The text of the current item is returned by currentText(), and the text of a numbered item is returned with text(). The current item can be set with setCurrentIndex(). The number of items in the combobox is returned by count(); the maximum number of items can be set with setMaxCount(). You can allow editing using setEditable(). For editable comboboxes you can set auto-completion using setCompleter() and whether or not the user can add duplicates is set with setDuplicatesEnabled().
http://doc.qt.nokia.com/latest/qcombobox.html

W zasadzie w QT widzę, że dane są aktualizowane przy każdym dodaniu elementu. A sprawdź pod konsolą czy zadziała dobrze sekwencja:
1) wyświetl listę
2) dodaj element
3) wyświetl listę
Spróbuj również w graficznym wyczyścić całą listę w miejscu gdzie lista powinna się zaktualizować. Może po prostu w bazie dane się nie aktualizują?
P-30640
esencee
Temat założony przez niniejszego użytkownika
» 2011-04-11 22:29:45
Dzięki DejaVu za wskazówki, ale to rozwiązanie melana okazało się wystarczające :) Oczywiście miałem odświeżanie tych pól, ale nie jako metoda i robiłem to tylko raz, na samym początku, co teraz wydaje mi się oczywistą głupotą :)

Dzięki serdeczne za pomoc!
P-30643
« 1 »
  Strona 1 z 1