Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Polish
  4. Problem z QModelIndex i QFile
Forum Updated to NodeBB v4.3 + New Features

Problem z QModelIndex i QFile

Scheduled Pinned Locked Moved Polish
10 Posts 2 Posters 4.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • W Offline
    W Offline
    Wolf89
    wrote on last edited by
    #1

    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.

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      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.

      (Z(:^

      1 Reply Last reply
      0
      • W Offline
        W Offline
        Wolf89
        wrote on last edited by
        #3

        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.

        1 Reply Last reply
        0
        • W Offline
          W Offline
          Wolf89
          wrote on last edited by
          #4

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

          1 Reply Last reply
          0
          • sierdzioS Offline
            sierdzioS Offline
            sierdzio
            Moderators
            wrote on last edited by
            #5

            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);
            }
            @

            (Z(:^

            1 Reply Last reply
            0
            • W Offline
              W Offline
              Wolf89
              wrote on last edited by
              #6

              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:/

              1 Reply Last reply
              0
              • sierdzioS Offline
                sierdzioS Offline
                sierdzio
                Moderators
                wrote on last edited by
                #7

                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).

                (Z(:^

                1 Reply Last reply
                0
                • W Offline
                  W Offline
                  Wolf89
                  wrote on last edited by
                  #8

                  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:)

                  1 Reply Last reply
                  0
                  • W Offline
                    W Offline
                    Wolf89
                    wrote on last edited by
                    #9

                    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);
                    }@

                    1 Reply Last reply
                    0
                    • sierdzioS Offline
                      sierdzioS Offline
                      sierdzio
                      Moderators
                      wrote on last edited by
                      #10

                      Fajn. Miłego dalszego kodzenia :)

                      (Z(:^

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved