Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Smirnov от Июля 10, 2011, 18:51



Название: Чтение файла QFile
Отправлено: Smirnov от Июля 10, 2011, 18:51
Есть функция которая не работает... Делал по примеру, не пойму в чем дело. В textEdit ничего не выводит...
Код:
 void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    QFile file_main_plc(fileName);
    if (!file_main_plc.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->textEdit->setPlainText("error");
        return;
    }
}

Код:
void MainWindow::on_pushButton_2_clicked()
{
    QTextStream stream_main_plc(&file_main_plc);
    while (!stream_main_plc.atEnd()) {
        QString line = stream_main_plc.readLine();
        ui->textEdit->setPlainText(line);
    }
}


Название: Re: Чтение файла QFile
Отправлено: lit-uriy от Июля 10, 2011, 18:59
первая функция ничего не выведет если не будет ошибки открытия файла.
вторая ничего не выведет, в случае:
либо файл не открыт,
либо последняя строка в нём пустая.


Название: Re: Чтение файла QFile
Отправлено: LisandreL от Июля 10, 2011, 20:32
+ к выше сказанному:
В первой функции переменная file_main_plc локальная и ничего общего с одноимённой переменной из второй функции не имеет.
Соответственно на выходе из on_pushButton_clicked локальная переменная file_main_plc удаляется и файл закрывается.


Название: Re: Чтение файла QFile
Отправлено: Smirnov от Июля 11, 2011, 12:27
переписал файл в таком виде
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

QTextStream stream_main_plc;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->setText("Open main schematic");
    ui->pushButton->setGeometry(10,10,150,20);
    ui->pushButton_2->setGeometry(10,40,150,20);
}

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

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    QFile file_main_plc(fileName);
    if (!file_main_plc.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->textEdit->setPlainText("error");
        return;
    }
    QTextStream stream_main_plc(&file_main_plc);
    statusBar()->showMessage("Waiting...");

}

void MainWindow::on_pushButton_2_clicked()
{

    while (!stream_main_plc.atEnd()) {
        QString line = stream_main_plc.readLine();
        QStringList list1 = line.split(";");
        ui->textEdit->append(list1[0]);
    }
    statusBar()->showMessage("Done");
}

QTextStream stream_main_plc вроде как должна теперь быть видна из всех функций в этом файле... Но не выводит ничего в textEdit

в таком виде все работает
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

//QTextStream stream_main_plc;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->pushButton->setText("Open main schematic");
    ui->pushButton->setGeometry(10,10,150,20);
    ui->pushButton_2->setGeometry(10,40,150,20);
}

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

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    QFile file_main_plc(fileName);
    if (!file_main_plc.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->textEdit->setPlainText("error");
        return;
    }
    QTextStream stream_main_plc(&file_main_plc);
    statusBar()->showMessage("Waiting...");
    while (!stream_main_plc.atEnd()) {
        QString line = stream_main_plc.readLine();
        QStringList list1 = line.split(";");
        ui->textEdit->append(list1[0]);
    }
    statusBar()->showMessage("Done");
}

void MainWindow::on_pushButton_2_clicked()
{


}

Подскажите, пожалуйста, как правильно объявить переменную QTextStream stream_main_plc чтобы она была видна в on_pushButton_2_clicked()


Название: Re: Чтение файла QFile
Отправлено: kambala от Июля 11, 2011, 13:42
переменную типа QFile тоже надо делать глобальной/членом класса - файл автоматически закрывается по выходе из функции, поскольку создан в стеке, потому и поток не работает в другой функции


Название: Re: Чтение файла QFile
Отправлено: Smirnov от Июля 11, 2011, 14:10
переменную типа QFile тоже надо делать глобальной/членом класса - файл автоматически закрывается по выходе из функции, поскольку создан в стеке, потому и поток не работает в другой функции
В этом и вопрос.. Где ее написать чтобы она стала глобальной?


Название: Re: Чтение файла QFile
Отправлено: Smirnov от Июля 11, 2011, 14:51
Разобрался... Вот код...

Объявляем в private QTextStream stream_main_plc и QFile file_main_plc
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include <QFile>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT


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



private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QTextStream stream_main_plc;
    QFile file_main_plc;
};

#endif // MAINWINDOW_H


и далее сам код...
Код:
void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this);
    file_main_plc.setFileName(fileName);
    if (!file_main_plc.open(QIODevice::ReadOnly | QIODevice::Text)){
        ui->textEdit->setPlainText("error");
        return;
    }
    stream_main_plc.setDevice(&file_main_plc);
    statusBar()->showMessage("Waiting...");

}

void MainWindow::on_pushButton_2_clicked()
{
    while (!stream_main_plc.atEnd()) {
        QString line = stream_main_plc.readLine();
        QStringList list1 = line.split(";");
        ui->textEdit->append(list1[0]);
    }
    statusBar()->showMessage("Done");

}