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