Zawartość ListView z pliku tekstowego



  • Witam!

    Mam interesujący problem. Tytułem wstępu: mam QLineEdit, QDateEdit oraz QListView. Nie jest dla mnie problemem dodanie czegoś ot tak do listy. Problem w tym, że zawartość tej listy muszę przechowywać w pliku tekstowym.

    !http://i45.tinypic.com/29nec5y.jpg(HowItShouldWork)!
    Nie mam koncepcji jak to rozwiązać (tu jest pierwszy zgrzyt), a jest to o tle istotne, że przy otwieraniu okna trzeba sprawdzić czy plik istnieje i jeśli istnieje, to trzeba nim wypełnić listę... Najtrudniejsze jest to, że jeśli usunę wpis z listy to powinna zniknąć z pliku txt informacja o tym, (nie wiem dlaczego kojarzy mi się z parsowaniem) bo o ile pokazywanie na liście jako tekst ma sens o tyle szkoda żeby data traciła na użyteczności. Jakąś ideą jest taka zawartość pliku:
    nazwaszkolenia[i], dataszkolenia[i];
    nazwa szkolenia[i++], dataszkolenia[i++];

    Jest to dla mnie trudne do realizacji bo nie wiem na ile moja koncepcja jest logiczna i możliwa do zrealizowania. Za wszelakie wskazówki z góry dziękuję ;)

    EDIT:
    Z odczytem sobie chałupniczo poradziłem (względnie):
    @QString zawartoscPodstawowa = file.readLine();
    ui->SzkoleniacomboBox->addItem(zawartoscPodstawowa);@

    Nie działa to najlepiej bo dorzuca znak przejścia do nowej linii przez co psuje wygląd ale działa. Jeśli ktoś wie jak się takiego efektu pozbyć, to proszę o oświecenie ;)

    Przykre jest też to, że while(zawartoscPodstawowa != " "){
    kod powyżej
    }
    nie nadaje się do szukania końca wczytywania.



  • Witam,
    Po pierwsze poleciłbym korzystanie z XML było by o wiele łatwiejsze i szybsze w Twoim wypadku.
    Link: http://doc.qt.digia.com/qt/qtxml.html (jeślibyłbys zainteresowany)

    A co do edycji "dorzuca znak przejścia do nowej linii przez co psuje wygląd ale działa" po prostu
    zignorujemy whitespaces czyli:
    @QString zawartoscPodstawowa = file.readLine();
    zawartoscPodstawowa = zawartoscPodstawowa.simplified();
    ui->SzkoleniacomboBox->addItem(zawartoscPodstawowa);@

    No i po trzecie:
    "Przykre jest też to, że while(zawartoscPodstawowa != “ “){
    kod powyżej
    }
    nie nadaje się do szukania końca wczytywania."

    @while(zawartoscPodstawowa != NULL){
    kod powyżej
    }@

    Pozdrawiam.



  • @ //budowanie listy
    QString fileName = ("D:\szkolenia.txt");
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly)) {
    QMessageBox::critical(this, tr("Error"),
    tr("Nie mogę wczytać listy szkoleń"));
    return;
    }
    QString zawartoscPodstawowa = file.readLine();
    zawartoscPodstawowa = zawartoscPodstawowa.simplified();
    while(zawartoscPodstawowa != NULL){
    QString zawartoscPodstawowa = file.readLine();
    zawartoscPodstawowa = zawartoscPodstawowa.simplified();
    ui->SzkoleniacomboBox->addItem(zawartoscPodstawowa);
    }
    file.close();
    @
    Chyba nie zrozumiałem o co kaman bo systematycznie wieszam program. W czym popełniłem błąd?



  • Hmm, spróbuj przed while usunąć tą linijke " zawartoscPodstawowa = zawartoscPodstawowa.simplified();" ponieważ moze null zamienia na spacje.

    Edit
    Spróbuj użyć QTextStream bo nie zauwazyłem ze masz. :)
    @ QString fileName = ("D:\szkolenia.txt");
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly| QIODevice::Text)) {
    QMessageBox::critical(this, tr("Error"),
    tr("Nie mogę wczytać listy szkoleń"));
    return;
    }
    QTextStream text(&file);

                   while(!text.atEnd()){
                
                QString zawartoscPodstawowa = text.readLine();
                    zawartoscPodstawowa = zawartoscPodstawowa.simplified();
                     ui->SzkoleniacomboBox->addItem(zawartoscPodstawowa);
                }
                file.close();@


  • Nie do końca rozumiem dlaczego while w pierwszej opcji nie działał tak jak powinien ale najważniejsze, że obecnie działa wszystko tak jak powinno ;)

    Dzięki wielkie!



  • !http://i47.tinypic.com/4t6mvc.jpg(cos)!
    Generalnie muszę przepisać wszystko co mam w tych dwóch oknach bo użyłem QDialog, a możliwość ich równoczesnego istnienia jest z mojego punktu widzenia, totalnie niekorzystna. Głębiej się też zastanowiłem nad działaniem tej części programu. Brakuje mi możliwości stworzenia takiej relacji SQL'owej bo teraz muszę operować na liniach w pliku. Wystarczy prosty błąd po stronie użytkownika i mogę mieć problem. Do tej pory myślałem tak: dodawać nazwę szkolenia i datę, zapisywać to w pliku i po każdym dodaniu szkolenia na nowo wczytywać zawartość pliku do ListView. Tą samą zawartość pliku tylko w całości jako String wczytywać do Combo boxa i wybierając z niego pozycję dodawać szkolenia w pierwszym oknie z danymi użytkownika. Teraz wydaje mi się to megabezsensowne. I chyba słusznie.
    Zapisywanie wynika z tego, że nie chcę tracić zawartości ListView przy każdym niszczeniu okna.
    Pewnie gdybym wiedział jak się je XML'a to można by sobie sprawę uprościć.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.