不二如是 发表于 2016-11-4 16:08:11

151-文本流读/写文本文件-【扫盲】

本帖最后由 不二如是 于 2016-11-4 16:31 编辑



没错啦,只要把上面的帮助文档,翻一下,就是这一贴啦~

好,开始翻译~

QTextStream类提供了一个方便的接口来读/写文本,可以在QIODevice、QByteArray、QStrirng上进行操作。

使用QTextStream的流操作符(<<),可以方便的读/写单词、行、数字。

对于生成文本,QTextStream对字段填充、对齐、数字格式提供了选项支持~

QFile data("output.txt");
if (data.open(QFile::WriteOnly | QFile::Truncate)) {
    QTextStream out(&data);
    out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
    // writes "Result: 3.14      2.7       "写入Resule:3.14 2.7
}

QTextStream提供的所有格式选项可以在该类的帮助文档进行查看。

setDevice()、setString()同样可以设置QTextStream要操作的设备或者字符串。

在内部,QTextStream使用了一个基于Unicode的缓冲区。主要就是用来Mingw482支持中文的哈~

重点来了~

使用QTextStream读取文本文件一般使用一下3种方式!


[*]进行一行接着一行的读取

调用readLine()或者readAll()进行行读取~举一个之前用过的代码:
QFile file(“in.txt”);
if(! file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
QTextStream in(&file);
while(! in.atEnd())
{
//进行行读取
        QString line = in.readLine();
}


[*]一个单词接着一个单词

QTextStream支持到QString、QByteArray、char *缓冲区的流,单词由空格分开,而且可以自动跳过前导空格。


[*]一个字符接着一个字符

使用QChar或者char类型的流,用于解析文件、使用独立的字符编码和行结束语义时方便处理。

skipWhiteSpace()可用来跳过空格~



默认的,当从文本流中读取数字时,QTextStream会自动检测数字的基数表示。

QTextStream in("0x50 0x20");
int firstNumber, secondNumber;

in >> firstNumber;             // firstNumber == 80
in >> dec >> secondNumber;   // secondNumber == 0

char ch;
in >> ch;                      // ch == 'x'

如果数字以‘0x’开头,自动假定为十六进制形式。

1~9开头,自动假定为十进制。

Qt提供了一个基于QTextStream、QFile、QDir的示例程序-

Find Files Dialog

很牛x~

有兴趣自己看啦~

wei_Y 发表于 2016-11-5 19:25:09

本帖最后由 wei_Y 于 2016-11-5 20:18 编辑

不二,我发现了Qt一个有趣的问题。

当然是PYQT。。

我把一个Qt对象写在类里面就会正常执行,写在函数里就不会正常执行。

比如有一个

class Message(QMessageBox):
    .......

就是一个继承了MessageBox的类。

我如果是在另一个类里:
class Main(QWidgets):
   .....
   msg = Message()
   msg.exec()

他会正常显示Message并且可以正常交互退出。

但是我如果把他搞在一个函数里。
def fff():
    msg = Message()
    msg.exec()

然后他 有时会显示出Message 但是不可交互而且界面会卡死,有时直接卡死。

类似的我又试了QNetworkAccessManager也是一样的问题。


还有一个问题:
Message自定义大小好像没用?

resize 和 setFixedsize都试了。

不二如是 发表于 2016-11-6 14:02:02

wei_Y 发表于 2016-11-5 19:25
不二,我发现了Qt一个有趣的问题。

当然是PYQT。。


1.当你把某个类写进一个函数,要确定是否真的继承了这个类,没有的话,在最上面加上类似#include<QMessageBox>声明

2Message自定义大小?是用来限制传递信息大小吗?


wei_Y 发表于 2016-11-6 14:12:59

不二如是 发表于 2016-11-6 14:02
1.当你把某个类写进一个函数,要确定是否真的继承了这个类,没有的话,在最上面加上类似#include声明

...

我就是实例化了这个继承自QT 类的自定义类。

然后如果是在另一个实例化的类里可以很好的执行,否则就不能执行其功能。
我猜是那个Application的问题。

自定义大小是 Message窗口的大小,不是内容的大小。

本来用QMessageBox觉得比较方便。。看来还是要换成QDialog了。

不二如是 发表于 2016-11-6 14:15:50

wei_Y 发表于 2016-11-6 14:12
我就是实例化了这个继承自QT 类的自定义类。

然后如果是在另一个实例化的类里可以很好的执行,否则就 ...

是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的

有的可以直接调用某类,有的需要声明,但区别也就如此

wei_Y 发表于 2016-11-6 14:19:25

不二如是 发表于 2016-11-6 14:15
是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的


还有个新问题。

不二如是 发表于 2016-11-6 14:21:01

wei_Y 发表于 2016-11-6 14:19
还有个新问题。

请讲:最好在你类似的帖子下面回复~

为后人扫清障碍{:10_257:}

wei_Y 发表于 2016-11-6 14:25:43

不二如是 发表于 2016-11-6 14:15
是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的


Qt4 里用 QApplication -> winEventFilter 可以捕获windows系统消息。
Qt5 里变成 QAbstractNativeEventFilter -> nativeEventFilter。

虽然确实是捕获到了windows消息。。
但是——c++里用reinterpret_cast 这个函数(还是內建函数!!!)转换成0x011这样的形式。
但是python里木有reinterpret_cast 这个函数,
我试了QByteArray里所有的函数都不能转化成0x011这个形式。(toHex看着美好结果转出来是什么鬼!)

然后判断不了是什么消息啊。。

问题是:怎么判断 收入的消息类型。

最终目标是:全局热键捕获。

wei_Y 发表于 2016-11-6 14:28:15

不二如是 发表于 2016-11-6 14:21
请讲:最好在你类似的帖子下面回复~

为后人扫清障碍

2333,还没出到全局热键的文章。

不二如是 发表于 2016-11-6 16:38:03

wei_Y 发表于 2016-11-6 14:28
2333,还没出到全局热键的文章。

会的~

我现在手头笔记本没法搞Qt,周一我试试告诉你结果哈~

不二如是 发表于 2016-11-7 09:31:55

wei_Y 发表于 2016-11-6 14:25
Qt4 里用 QApplication -> winEventFilter 可以捕获windows系统消息。
Qt5 里变成 QAbstractNativeEvent ...

1.
QByteArray ba;
ba.resize(5);
ba = 0x3c;
ba = 0xb8;
ba = 0x64;
ba = 0x18;
ba = 0xca;

QByteArray 支持判断信息类型。。。并且初始化0x -也就是16进制

2.直接强制换。。。
十进制->十六进制
i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
二进制-十六进制
strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);

字符-十六进制
strcpy(s,"a汉");
    i=0;
    while (1) {
      if (0==s) break;
      sprintf(hs+i*2,"%02X",(unsigned char)s);
      i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);

wei_Y 发表于 2016-11-10 12:24:27

不二如是 发表于 2016-11-7 09:31
1.




换成win32的api了。。始终没搞定qt。。

不二如是 发表于 2016-11-10 13:24:38

wei_Y 发表于 2016-11-10 12:24
换成win32的api了。。始终没搞定qt。。

你要电脑上安装VS2010那些库、Qt很好搞
页: [1]
查看完整版本: 151-文本流读/写文本文件-【扫盲】