Member 12587659 Ответов: 2

Открытие файла в одной функции и чтение текста в другом слоте(qt)


код проекта есть..

QFile logfile;
bool Candump::openConnection()
{
    QString CandumpFileName = "C:/xamDevelopment/readfiles/P_1.trc";
    QFile logfile(CandumpFileName);

    if (!logfile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        logger()->error("Error occured while opening CANdump file");
    }
QTimer *CanIOtimer = new QTimer(this);
    CanIOtimer->start(20);
    connect(CanIOtimer, SIGNAL(timeout()), this, SLOT(ReadTextFileData()));
}


Слот выглядит следующим образом

void Candump::ReadTextFileData()
{
 qDebug()<<logfile.isOpen(); //here file is going to close. I want file opened in this slot
}


как я могу это сделать?? пожалуйста, поделитесь своим опытом и знаниями..

Что я уже пробовал:

Я хочу, чтобы в следующем шаге
1: Открыть файл
2: таймер запуска
3: соедините тайм-аут приемника () со слотом ReadTextFileData()

в ReadTextFileData
прочтите одну строчку

2 Ответов

Рейтинг:
9

Jochen Arndt

Карстен прав, что вы должны сделать QFile член класса вместо использования глобального экземпляра.

Но реальная проблема заключается в том, что у вас есть глобальный экземпляр, объявленный сверху, и вы используете локальный экземпляр с тем же именем в своем openConnection функция. Таким образом, глобальный экземпляр никогда не получает назначенного имени файла и никогда не открывается.

Это должно работать именно так:

#include <qfile>

// Better make this a member of your Candump class
QFile logfile;

bool Candump::openConnection()
{
    QString CandumpFileName = "C:/xamDevelopment/readfiles/P_1.trc";
    // This creates a new (local) QFile instance with the same name as the global one.
    //QFile logfile(CandumpFileName);
    // Use the global / class instance instead:
    logfile.setFileName(CandumpFileName);
 
    if (!logfile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        logger()->error("Error occured while opening CANdump file");
    }
    // ...
}</qfile>


Рейтинг:
1

KarstenK

вы должны сделать файл журнала членом класса. Обычный способ-объявить его в заголовке или интерфейсе класса.

Будьте осторожны при обработке ошибок: проверьте, существует ли файл и открыт ли он где-нибудь (деструктор).

Совет: Не используйте имена файлов с жестким кодом и путь к ним


Member 12587659

спасибо за ваше предложение
Я сделал это, но я получаю ошибку
нет совпадения для вызова '(qfile) (qstring &)'
in. h FILE- & gt; QFile logfile;
в файле. cpp ->
QString CandumpFileName = "C:/XamDevelopment/readfiles/P_1.trc";
logfile (CandumpFileName); / / получение ошибки в этой строке