Russian Qt Forum
Май 05, 2024, 15:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение файла QFile  (Прочитано 5310 раз)
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);
    }
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 10, 2011, 18:59 »

первая функция ничего не выведет если не будет ошибки открытия файла.
вторая ничего не выведет, в случае:
либо файл не открыт,
либо последняя строка в нём пустая.
Записан

Юра.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Июль 10, 2011, 20:32 »

+ к выше сказанному:
В первой функции переменная file_main_plc локальная и ничего общего с одноимённой переменной из второй функции не имеет.
Соответственно на выходе из on_pushButton_clicked локальная переменная file_main_plc удаляется и файл закрывается.
Записан
Smirnov
Гость
« Ответ #3 : Июль 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()
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Июль 11, 2011, 13:42 »

переменную типа QFile тоже надо делать глобальной/членом класса - файл автоматически закрывается по выходе из функции, поскольку создан в стеке, потому и поток не работает в другой функции
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Smirnov
Гость
« Ответ #5 : Июль 11, 2011, 14:10 »

переменную типа QFile тоже надо делать глобальной/членом класса - файл автоматически закрывается по выходе из функции, поскольку создан в стеке, потому и поток не работает в другой функции
В этом и вопрос.. Где ее написать чтобы она стала глобальной?
Записан
Smirnov
Гость
« Ответ #6 : Июль 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");

}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.