Problem z QModelIndex i QFile



  • Witam, jako że jestem nowy na forum a w programowaniu jeszcze nowszy :) prosze z góry o wyrozumiałość.

    Mam problem z odczytaniem i/lub "wyświetleniem" zawartości z pliku tekstowego, na poziomie listView używając metody QModelIndex chciałbym aby zawartość wybranego pliku z listview została wyswietlona w textEdit (text zapisany w html).

    Oto zrzut ekranu
    http://img827.imageshack.us/img827/9817/eksplorator.jpg

    A tu kod
    @#include "ui_eks.h"
    #include "okno.h"
    #include "ui_okno.h"
    #include <QtGui>
    #include <QtCore>
    #include <QDir>
    #include <QFile>
    #include <QDirModel>
    #include <QFileSystemModel>

    Eks::Eks(QWidget *child) :
    QDialog(child),
    ek(new Ui::Eks)
    {
    ek->setupUi(this);
    dir = new QFileSystemModel(this);
    QModelIndex index = dir->index(QDir::currentPath() + "/Baza");
    dir->setRootPath(QDir::currentPath() + "/Baza");
    dir->setFilter(QDir::NoDotAndDotDot|QDir::AllDirs);
    ek->treeView->setModel(dir);
    ek->treeView->scrollTo(index);
    ek->treeView->setColumnWidth(0,400);

    fil = new QFileSystemModel(this);
    fil->setRootPath(QDir::currentPath() + "/Baza");
    fil->setFilter(QDir::NoDotAndDotDot|QDir::Files);
    ek->listView->setModel(fil);
    

    // ek->textEdit->setText(QDir::currentPath());
    }

    Eks::~Eks()
    {
    delete ek;
    }

    void Eks::on_treeView_activated(const QModelIndex &index)
    {
    QString path = dir->fileInfo(index).absoluteFilePath();
    ek->listView->setRootIndex(fil->setRootPath(path));
    QStringList filters;
    filters << ".kbf" << ".hbs";
    fil->setNameFilters(filters);
    }

    void Eks::on_listView_activated(const QModelIndex &index)
    {
    QString fit = index.data(0).toString();
    QDir pat;
    QString p = pat.absoluteFilePath(QFile(fit).fileName()).toAscii();
    QFile file(p);
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
    QTextStream a(&file);
    QString b = a.readAll();
    file.close();
    ek->textEdit->setHtml(b);

    }else QMessageBox::information(this,"Blad","Nie powiodlo sie");
    

    }@

    Jest to jedna z wielu moich kombinacji ale prawie za kazdym razem jesli kompilator nie zgłasza błedu to w textEdit po uruchomieniu i tak nie pokazuje sie zawartość pliku. W innym miejscu programu uzyłem podobnej metody lecz wybor pliku nastepuje metodą QFileDialog i wszystko działa nie wiem gdzie popełniam bład mozliwe ze jest bardzo głupi ale jestem samoukiem wiec prosze nie spodziewac sie po mnie wiele. i za smietnik w kodzie tez przepraszam:D. Dzieki za wszelką pomoc i pozdrawiam.


  • Moderators

    To nie przepraszaj tylko posprzątaj ;) I raczej nie programuj po polsku.

    Głowy nie dam, ale osobiście użyłbym sygnału QTreeView::selectionChanged() a nie ::activated(). Activated jest wysyłany rzadziej niż zmiana selekcji. Dodaj jakiś qDebug() do obu slotów by przekonać się, że są odpalane (albo zdebuguj aplikację).

    Nie jestem pewien, o co chodzi w kawałku "po uruchomieniu" - tzn. kod działa gdy np. dwukrotnie klikniesz na daną pozycję? Tylko zaraz po włączeniu aplikacji nic się nie dzieje? Jeśli tak, to dorzuć do konstruktora wywołanie slotów (np. on_listView_activated(listView->currentIndex());), albo w jakiś inny sposób zaktywuj listView.



  • jesli klikne dwukrotnie to w tym sposobie plik zostaje otwarty (tzn. nie pojawia sie QMwssageBox) jesli natomiast o qDebug chodzi to juz probowałem tutaj akórat je usunąłem ale starałem sie sprawdzac kazdy fragment kodu pokolei, debugowanie tez nie zwraca zadnych informacji o błedach czy problemach a selectionChanged() wogole nie ma do wyboru w slotach chyba ze chodzi tobie o cos innego. czyli sam program działa i nie pokazuje błedów natomiast gdy wpisze coś do textEdit i klikne dwukrotnie na pliku z listView to text w textEdit zostaje wyczyszczony tak jak by plik był pusty albo nieczytelny dla textEdit. Jesli zas chodzi o konwertowanie do Ascii to probowałem tez do innych formatów a takze bez formatowania wiec nie wiem co jest jeszcze nie tak.



  • sorry za błędy ortograficzne jestem niewyspany i piszę w pośpiechu a przeglądarka anglojęzyczna(Nightly) więc mnie nie poprawi


  • Moderators

    Spoko, polskiego nie używam zbyt często to i sam zapominam. Z resztą sądzę że mogli by polski uprościć, ortografia do niczego nie jest potrzebna tylko utrudnia.

    Hm, ok. Byś może problemem jest więc sam odczyt z pliku. Spróbuj zrezygnować z QTextStream:
    @
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
    QString b(file.readAll());
    file.close();
    ek->textEdit->setHtml(b);
    }
    @



  • Teraz wyskakuje QMessageBox ale tego juz wogole nie rozumiem skoro wtedy mogł otworzyc plik i cztac z niego a teraz nie?
    To jest fragment o którym wspominałem wcześniej i działa bezproblemowo
    @void Pri::on_op_released()
    {
    QString file = QFileDialog::getOpenFileName(this);
    if(!file.isEmpty())
    {
    QFile druk(file);
    if(druk.open(QFile::ReadOnly|QFile::Text))
    {
    QTextStream dr(&druk);
    QString ht = dr.readAll();
    druk.close();
    pr->textEdit->setHtml(ht);
    }
    }
    }@

    Więc może gdzies jest problem ze ścieżką albo index'em? Zamotany jestem jak kłębek włóczki:/


  • Moderators

    O tej godzine mój mózg nie pracuje na wysokich obrotach :) Spróbuję jutro zajrzeć. Póki co, jedyna myśl to taki debug:
    @
    ...
    QString p = pat.absoluteFilePath(QFile(fit).fileName()).toAscii();
    QMessageBox::information(this,"Debug","Path: " + p);
    ...
    @

    Możliwe że ten kod źle buduje ścieżkę (np. fit zawiera tylko nazwę pliku, bez folderu bazowego).



  • wychodzi na to ze index do listView jest błedny bo sciezka podczas wybierania z innego folderu jest wyswietlana dla folderu z programem łącznie z nazwa pliku, natomiast dla pliku z folderu programu, Qmessagebox z mojego else. Kod

    @ if(file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
    QTextStream a(&file);
    QString b(file.readAll());
    file.close();
    ek->textEdit->setHtml(b);
    QString p = pat.absoluteFilePath(QFile(fit).fileName()).toAscii();
    QMessageBox::information(this,"Debug","Path: " + p);

    }else QMessageBox::information(this,"Blad","Nie powiodlo sie");@
    

    Czyli cała noc jeszcze przede mną :) albo bedzie trzeba cała metode uproscic do jednego treeView z wyswietlanymi plikami. W kazdym razie dzieki za pomoc na dzis jesli do czegos dojde to umieszcze rozwiazanie jesli nie to poprosze jeszcze jutro o pomoc:)



  • Problem rozwiązany, był to mój bład po pierwsze zamiast odnosic sie do index.data(0)... wystarczyło powtorzyc to co było w treeView a wiec fil->fileInfo(index)... Po drugie przez zmeczenie zacząłem mylic zmienne ktore przypisywałem. Rozwiązanie

    @ QString file = fil->fileInfo(index).absoluteFilePath();
    QFile a(file);
    if(a.open(QIODevice::ReadOnly|QIODevice::Text))
    {
    QTextStream b(&a);
    QString c(b.readAll());
    a.close();
    ek->textEdit->setHtml(c);
    }@


  • Moderators

    Fajn. Miłego dalszego kodzenia :)


Log in to reply
 

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