Название: Чтение файла 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");
}
|