Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QtScript: Работа с файлами
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Script. Интеграция WebKit
JohnZ
Нужно read/write txt/bin файлы, ес-сно из QT скрипта.
QT 4.8.2
Гугл ничего полезного, кроме fileReader() которого нет в QT Script, не выдаёт.
Нужно накладную в XML / JSON-е выгрузить в файл для отправки.

Подскажите плз, это нужно его ( QFile ) дописать самому в движок ?
Может уже есть у кого сей объект, поделитесь если не жалко.
Заранее благодарен за помощь.
JohnZ
Народ, аууу ! Вопрос актуален ! Или в скриптах ниХто не пользуется файлами ?!
Не верю ... ( Почти по Ст-му :-) )
Про генератор обёртки я в курсе, но я так и не смог на RPi-2 его зпустить для QT 4.8.2,
да и по другим причинам не хотелось-бы его юзать ...
Вобщем HELP ещё раз ...
lanz
Я когда делал просто делал функцию сишную, которая сохраняла файл, и ее дергал из скрипта когда нужно.
Iron Bug
Я не юзаю Qt, но у меня есть идея, что для сети файл - это тоже ресурс вида file://bla-bla-bla/myfile.bin и может быть эта хрень сможет таким образом его считать, как сетевой ресурс?
JohnZ
БлагоДарю за ответы !
СлепилЪ я этот класс, может кому-то и пригодится, - ловите.

H
Раскрывающийся текст

#ifndef __QSFILE_H__
#define __QSFILE_H__

#include <QFile>
#include <QObject>
#include <QtScript>
#include <QIODevice>

//Q_DECLARE_METATYPE(QSFile *)

class QSFile : public QObject
{
Q_OBJECT

public:

QSFile(QObject *parent = 0);
// QSFile(QString Name, int type);
~QSFile();

public slots:

Q_INVOKABLE bool Open(QString fn, int type);
Q_INVOKABLE void Close();

Q_INVOKABLE QByteArray Read(qint64 maxSize);
Q_INVOKABLE QByteArray ReadAll() { return qFd->readAll(); }
Q_INVOKABLE QByteArray ReadLine(qint64 maxSize = 0) { return qFd->readLine(maxSize); }

// Q_INVOKABLE qint64 Write(const QByteArray data);
Q_INVOKABLE qint64 Write(const QString data);

Q_INVOKABLE int getChar();
Q_INVOKABLE bool putChar(int c);

// Q_INVOKABLE QString fileName() { return fName; }
// Q_INVOKABLE void setFileName(QString name) { fName = name; }

Q_INVOKABLE bool atEnd() { return qFd->atEnd(); }
Q_INVOKABLE bool isOpen() { return qFd->isOpen(); }
Q_INVOKABLE qint64 pos() { return qFd->pos(); }
Q_INVOKABLE qint64 size() { return qFd->size(); }
Q_INVOKABLE bool seek(qint64 pos) { return qFd->seek(pos); }
Q_INVOKABLE bool flush() { return qFd->flush(); }

protected:

int iType;
QFile *qFd;
QString fName;
};

Q_SCRIPT_DECLARE_QMETAOBJECT(QSFile, QObject *)

void setupQSFile(QScriptEngine *engine);

#endif


CPP
Раскрывающийся текст


#include <QFileDialog>
#include <QMessageBox>
#include <QTextCodec>

#include "qsfile.h"


QSFile::QSFile(QObject *parent) : QObject(parent)
{
qFd = 0;
iType = 0;
fName.clear();
setObjectName("QSFile");
}

//QSFile::QSFile(QString Name, int type) : QObject(0)
//{
// qFd = 0;
// iType = type;
// fName = Name;
// setObjectName("QSFile");
// Open(Name, type);
//}

QSFile::~QSFile()
{
if (qFd)
Close();
}

bool QSFile::Open(QString fn, int type) // Y
{
bool rc;
QString fPath;

if (qFd && qFd->isOpen())
Close();

iType = type;

QIODevice::OpenMode Mode = QIODevice::NotOpen;

if (type & 1) Mode |= QIODevice::ReadOnly;
if (type & 2) Mode |= QIODevice::WriteOnly;
if (type & 16) Mode |= QIODevice::Text;

if (fn.isEmpty())
fName = QFileDialog::getOpenFileName(0, "Open File", fPath, "files (*.*)");
else fName = fn;

if (fName.isEmpty())
return false;

qFd = new QFile(fName);

rc = qFd->open(Mode);

if (!rc)
{
QMessageBox::warning(0, "MyProg", "Error open File !");
return false;
}

return true;
}

void QSFile::Close()
{
if (!qFd) return;
if (qFd->isOpen())
qFd->close();

delete qFd;
qFd = 0;
}

QByteArray QSFile::Read(qint64 maxSize)
{
return qFd->read(maxSize);
}

//qint64 QSFile::Write(const QByteArray data)
//{
// return qFd->write(data);
//}

qint64 QSFile::Write(const QString data)
{
// QByteArray Array = byteArray.toUtf8();
// QByteArray Array = byteArray.toAscii();
QByteArray Array = data.toLocal8Bit();
return qFd->write((const QByteArray &) Array);
}

bool QSFile::putChar(int c)
{
return qFd->putChar((char ) c);
}

int QSFile::getChar()
{
int c = 0;
qFd->getChar((char *) &c);
return c;
}

void setupQSFile(QScriptEngine *engine)
{
QScriptValue fileClass = engine->scriptValueFromQMetaObject<QSFile>();
engine->globalObject().setProperty("QSFile", fileClass);
}


Но есть несколько траблов, - QT Script в упор не хочет видеть заремленый конструктор (потому и заремил),
и так-же почему-то не понимает QByteArray ???
Тестил пока только на запись.
Юзается просто
    
       var json =" bla-bla-bla "
       var f = new QSFile();
    f.Open("nkl_" + nnom + ".json", 2);
    f.Write(json);
    f.Close();
    delete f;


а хотелось-бы

var f = new QSFile("nkl_" + nnom + ".json", 2);

... а для сети делаю класс qsSMTP для отправки накладной по почте.

Удачи !
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.