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.jpgA 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.
-
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
-
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:/
-
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);
}@ -
Fajn. Miłego dalszego kodzenia :)