Qt i odczyt/zapis

0

Witam, próbuje coś odczytać i zapisać z/do pliku txt za pomocą qt.
Jednak przy odczycie nic nie odczytuje, a przy zapisie nie zapisuje. Ale też nie wyskakuje żaden błąd, wiem za bardzo nie wiem co nie tak.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextStream>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    void OpenFile();
    void SaveFile();
private:
    QString OpenFileName;
    QString SaveFileName;
};

#endif // MAINWINDOW_H
 

mainwindow.cpp

 
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->actionOpen,SIGNAL(triggered(bool)),this, SLOT(OpenFile()));
    connect(ui->actionSave,SIGNAL(triggered(bool)),this, SLOT(SaveFile()));
    OpenFileName="C:\\Users\\Agata\\Documents\\grupaF.txt";
    SaveFileName="C:\\Users\\Agata\\Desktop\\obraz.txt";
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OpenFile()
{

    QFile file(OpenFileName);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QTextStream stream(&file);

    QString text=stream.readAll();
    ui->plainTextEdit->setPlainText(text);

}

void MainWindow::SaveFile()
{
    QFile file(SaveFileName);
    file.open(QIODevice::WriteOnly|QIODevice::Text);
    QTextStream stream(&file);
    stream<<ui->plainTextEdit->toPlainText();

}

No a lokalizacje na pewno mam okej podane. Prawilijnie tam powinien być jeszcze podany warunek sprawdzający, ale to potem dodam.

2

No to może jednak sprawdź ten warunek i wydrukuj sobie file.errorString()?

Swoją drogą, stosuj nową konwencję łączenia sygnałów i slotów.

0
 

    QFile file(OpenFileName);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
       QTextStream qout( stdout );
       qout<<"Nie udalo sie odczytac"<<endl;

    }

I faktycznie wyświetlilo mi, że nie udalo się odczytać. Więc gdzie teraz szukać dalej błędu? :P
Umm, ta nowa konwencja łączenia sygnałów i slotów daje coś?

0
kq napisał(a):

file.errorString()

0

W ifie dodać, tak? No i dodane już teraz w sumie.
Ale zastanawiam się czemu kurcze mi tego pliku nie znajduje, bo txt to jednak jest, lokalizacja dobra o.O

1

Zechciej kliknąć F1 i zobaczyć, że ta funkcja zwraca QString, który mówi jaki to problem został napotkany...

0

Ta file.errorString()? Zatem co, że gdzieś typ zmiennej rypnięty?

0

Nie, to funkcja zwracająca error string ostatniej nieudanej operacji tego obiektu. Proszę, kliknąłem za ciebie: http://doc.qt.io/qt-5/qiodevice.html#errorString

0

"Returns a human-readable description of the last device error that occurred." No to i udało mi się zobaczyć po tym F1 co mowiłeś, żeby kliknac.
Zwraca odczytywaną deskrypje o ostatnim błędzie urządzenia, który wystąpił?

0

Tak. Wyświetl sobie i będziesz miał powód, przez który nie udało się otworzyć pliku.

0

No such file or directory
Meh, dziwne.
Ale ogl coś mam z dziwnej strony qt i może temu nie znajduje.

0

Może masz włączone ukrywanie znanych rozszerzeń plików i to co widzisz jako "C:\\Users\\Agata\\Documents\\grupaF.txt" to tak naprawdę "C:\\Users\\Agata\\Documents\\grupaF.txt.txt"?

0

Faktycznie miałam, ale wyłączyłam teraz i dalej nie znajduje.
No nic, chociaż wiem teraz, że jest coś takiego jak file.errorString() ;)

0

Wyłączenie nie zmienia magicznie nazw plików.

0

W każdym razie na laborkach mi jakoś to działało, a skopiować ścieżkę to nawet ja umiem, więc hmm.

0

Dodaj .txt na koniec ścieżki i sprawdź czy działa.

0

Też właśnie nic nie daje, więc nie wiem <ściana>

0

Przeklej ścieżkę z programu do pola z nazwą pliku w notepadzie i zobacz czy zostanie otworzony.

0

O, udało mi się w końcu otworzyć jakiś stary plik txt z pulpitu tak.
Bo tamtego nie znajdowywało i w notepadzie, a ten stary już tak.

0

Dobrą praktyką jest również po otwatciu pliku zamknąć go:

QFile file(SaveFileName);
    file.open(QIODevice::WriteOnly|QIODevice::Text);
.......
.......
file.Close();
0

Tak swoją drogą, jest QFileDialog - może go użyj zamiast hardkodowanych błędnych ścieżek?

0

A gdyby chcieć dać użytkownikowi możliwość wskazania ścieżki to jakoś tak ma to wyglądać: ?

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->actionOpen,SIGNAL(triggered(bool)),this, SLOT(OpenFile()));
    connect(ui->actionSave,SIGNAL(triggered(bool)),this, SLOT(SaveFile()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OpenFile()
{
OpenFileName = QFileDialog ::getOpenFileName( this , tr( "Open text file..." ), tr( "" ), tr( "Text files (*.txt)" ));
    if(!OpenFileName.isEmpty())
    {

         QFile file(OpenFileName);
         QTextStream stream(&file);
         QString text=stream.readAll();
         ui->plainTextEdit->setPlainText(text);
    }

}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1