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();@
-
!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ć.