Qt如何读取windows下某个文件的数字签名应用示意图时间

&之前的 Qt 编程大多只涉及简单的多窗口,并未染指窗口间的传值交互,想来还是&涉世未深&,对 Qt 的理解、应用还需殷勤努力。
这次的问题是这样的,我想要实现一个类似QQ、阿里旺旺的聊天客户端,在弹出表情对话框后,能够选择表情并返回给聊天窗口的消息输入框,这就需要两个窗口之间的传值交互。
首先想到的解决方法自然是使用Qt自带的signal/slot机制。即首先发信号给父窗口,父窗口接到信号执行槽函数发送一个携带所需数据的信号给子窗口。但是疑问来了:要在子窗口中接收到父窗口的信号必须进行signal和slot的绑定。这需要主窗口类的定义(1)。担心头文件的递归包含,我们只好再想另外一个方法。直接在子窗口中利用指向父窗口的指针来访问父窗口类的成员怎么样?
说做就做,先写一个测试代码来试试。
mainwindow.ui 中有一个lineedit和pushbutton,点击之后弹出Dialog实例;dialog.ui 中有一个pushbutton,点击之后修改mainwindow中的lineedit的文本内容。
(1) mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void setLineText(QString str);
private slots:
void on_pushButton_clicked();
Ui::MainWindow *
#endif // MAINWINDOW_H
(2) mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "ui_dialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
MainWindow::~MainWindow()
void MainWindow::on_pushButton_clicked()
Dialog subwin(this); //"this" is very important.
subwin.setGeometry(x()-100, y()+100, wifth()-100, height()-100);
subwin.exec(); //needed.
void MainWindow::setLineText(QString str)
ui-&lineEdit-&setText(str);
(3) dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include &QDialog&
namespace Ui {
class Dialog : public QDialog
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void on_pushButton_clicked();
Ui::Dialog *
#endif // DIALOG_H
(4) dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
ui-&setupUi(this);
Dialog::~Dialog()
void Dialog::on_pushButton_clicked()
MainWindow *ptr = (MainWindow*)parentWidget();
//"parentWidget" very important. 获得父部件指针,同时需要类型强转.
ptr-&setLineText("i can do it, too.");
http://blog.csdn.net/jan5_reyn/article/details/
Views(...) Comments()Ghost win7 32位硬盘直装版最新系统下载-win7旗舰版
win7旗舰版 - 最好的win7系统下载网站!
当前位置: >
> Ghost win7 32位硬盘直装版最新系统下载
Ghost win7 32位硬盘直装版最新系统下载
发布时间: 作者:huahua
Ghost win7 32位硬盘直装版最新系统是在完全断网的情况下采用最新封装技术进行封装制作,确保系统安全稳定。Ghost win7 32位硬盘直装版最新系统采用适当的精简与优化,全面提升运行速度,充分保留原版性能和兼容性,同时采用注册表等其他方式已达最佳优化,运行速度更快使用更便捷。
一、系统特点
1、精心修复系统安全漏洞,免除被盗号的后顾之忧;
2、安全简单快速,全程无需值守,安装完成即永久激活,支持在线更新;
3、针对Winodws7 32位系统多达几十项的安全优化,让系统既稳定又快速;
4、支持新型号主板开启SATA AHCI/RAID安装,支持I5、I7平台;
5、强力清除某些PE安装本系统释放的恶意程序,保证系统干净;
6、自动安装AMD/Intel双核CPU驱动和优化程序,发挥新平台的最大性能;
7、离线制作,纯净无比安装过程自动检查各驱动器有无AUTO病毒,有则杀之;
8、通过数台不同硬件型号计算机测试安装均无蓝屏现象,硬件完美驱动;
9、系统经过优化,启动服务经过仔细筛选,确保优化的同时保证系统的稳定;
10、未经数字签名的驱动可以免去人工确认,使这些驱动在进桌面之前就能自动安装好;
11、针对最新主流高端配置电脑进行优化,专业驱动匹配,发挥硬件所有性能;
12、最新封装技术,更完善的驱动处理方式,极大减少&内存不能为read&现象;
13、集成了最新最全SRS驱动,适应各种新旧主机及使用,完美支持AHCI硬盘模式。
二、系统优化
1、自动释放内存,CPU、内存占用低;
2、加快开始菜单弹出速度;
3、减少开机滚动条的滚动次数;
4、关闭硬盘各分区的默认共享(如C$、D$、E$ &&);
5、关闭管理默认共享(ADMIN$);
6、安装驱动时不搜索Windows U
7、禁用搜索助手并使用高级搜索;
8、删除图标快捷方式的字样;
9、禁止高亮显示新安装的程序(开始菜单);
10、禁用杀毒,防火墙,自动更新提醒;
11、防止利用IPC$建立空连接;
12、关闭远程注册表服务(Remote Registry);
13、对数百款游戏进行优化设置,流畅度体验更好。
三、系统集成软件
1、360浏览器
2、腾讯视频
3、酷狗音乐
4、OFFICE 2007
6、QQ最新版
四、常见的问题及解答
1、问:为什么Win7下打开或关闭windows功能空白一片?
WindowsModulesInstaller服务被无意中关闭了,也许是某些优化设置类软件没有考虑到这个服务的必要性,在服务管理里面启动这个服务即可。如果您手头有Win7优化大师,用服务管理大师启用也可。系统自带的服务管理,大家在开始菜单中输入services.msc后回车就能打开。
2、问:游戏不能全屏?
在开始搜索框输入regedit打开注册表,定位到 HKEY_LOCAL_MACHINE------SYSTEM------ControlSet001-------Control-------GraphicsDrivers-------Configuration------ 然后右键点击Configuration,选择查找,输入Scaling,在右框内即可看到scaling,右键scaling选择修改,将数值改为3即可,原值为4即可。
------分隔线------
温馨提示:这里是下载地址,点击即可高速下载!
Win7旗舰版
Win7纯净版
Win7系统下载##环境说明
QtCreatorQtLibrary编译器
Qt Creator 2.7.0
4.8.4-msvc
msvc9.0(VS2008)
##背景说明
项目中需要对发布版本追踪崩溃问题,我们在项目中利用Qtbreakpoint来产生崩溃文件*.dump文件,但是若是想要对应的定位崩溃点还需要对应的&*.pdb&文件,但是在Qt的Release版本下默认是不产生*.pdb文件
##如何配置
方案1 修改编译环境,对所有项目的release都产生*.pdb文件,步骤如下:
找到编译器对应的配置文件,如我的系统安装的是VS2008则我需要找Qt的安装目录/4.8.4/\mkspecs\win32-msvc2008\qmake.conf
增加如下两行配置项到文件并保存
sh QMAKE_CFLAGS_RELEASE = -O2 -MD -Zi QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG
保存后重启Qtcreator或者直接重新新编译
缺陷是编译后的PDB文件不能自己修改名字和拷贝到二进制所在的目录
方案2 修改程序的工程文件&*.pro&,增加如下: *
sh QMAKE_LFLAGS_RELEASE += /MAP QMAKE_CFLAGS_RELEASE += /Zi QMAKE_LFLAGS_RELEASE += /debug /opt:ref&*&建议使用此种方式
http://daodaoliang.com/blog//Qt-msvc%E7%BC%96%E8%AF%91%E5%99%A8%E5%A6%82%E4%BD%95%E5%9C%A8Release%E4%B8%8B%E4%BA%A7%E7%94%9Fpdb%E6%96%87%E4%BB%B6.html
Views(...) Comments()声明:&事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:
&&&void&HelloWorld(); & &&//函数内部调用Win32 API,功能是弹出一个helloworld提示框&&&int&add(int&a,int&b); &//实现两个数相加,并返回结果
&下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....
预备知识:
&& & 1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。
&& & 2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()
&其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)
&& & & & GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用
&& & & & FreeLibrary() 释放dll所占空间&
1、显示调用&
&& & &Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:
&1&#include&&QApplication&&2&#include&&QLibrary&&3&#include&&QDebug&&4&#include&&QMessageBox&&5&#include&"dll.h" & & & & &&& //引入头文件&6&typedef&int&(*Fun)(int,int);&//定义函数指针,以备调用&7&int&main(int&argc,char&**argv)&8&{&9&&&&&QApplication&app(argc,argv);10&&&&&QLibrary&mylib("myDLL.dll"); &&//声明所用到的dll文件11&&&&&int&12&&&&&if&(mylib.load()) & & & & & & &//判断是否正确加载13&&&&&{14&&&&&&&&&QMessageBox::information(NULL,"OK","DLL&load&is&OK!");15&&&&&&&&&Fun&open=(Fun)mylib.resolve("add"); & &//援引 add() 函数16&&&&&&&&&if&(open) & & & & & & & & &//是否成功连接上 add() 函数17&&&&&&&&&{18&&&&&&&&&&&&&QMessageBox::information(NULL,"OK","Link&to&Function&is&OK!");19&&&&&&&&&&&&&result=open(5,6); & & &//这里函数指针调用dll中的 add() 函数20&&&&&&&&&&&&&qDebug()&&21&&&&&&&&&}22&&&&&&&&&else23&&&&&&&&&&&&&QMessageBox::information(NULL,"NO","Linke&to&Function&is&not&OK!!!!");24&&&&&}25&&&&&else26&&&&&&&&&QMessageBox::information(NULL,"NO","DLL&is&not&loaded!");
27 & & & & return 0; &//加载失败则退出
&myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。
2、隐式调用
&& &这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:
1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,
2、下面我们在pro文件中,添加 .lib 文件的位置:&LIBS+=&-L&D:/hitempt/api/&-l&myDLL
&& & & &&-L 参数指定 .lib/.a 文件的位置
&& & & & -l &参数指定导入库文件名(不要加扩展名)&
&& & & &&另外,导入库文件的路径中,反斜杠用的是向右倾斜的&
3、在程序中include头文件(我试验用的dll是用C写的,因此要用&extern "C" { #include "dll.h" }&)
&下面是隐式调用的实例代码:
&1&#include&&QApplication&&2&#include&&QDebug&&3&extern&"C" & &//由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意&4&{&5&&&&&&&&&#include&"dll.h"&6&}&7&int&main(int&argv&,char&**argv)&8&{&9&&&&&&&&QApplication&app(argv,argv);10&&& & & HelloWordl();&&&&&&&&&&//调用Win32&API&弹出helloworld对话框11&&& & & qDebug()&&add(5,6);&&&&//&dll&中我自己写的一个加法函数12&&& & &&return&0; &//完成使命后,直接退出,不让它进入事件循环13&}
还是隐式调用方便啊,直接就可以调用dll中的函数...
http://www.cnblogs.com/hicjiajia/archive//1810239.html
Views(...) Comments()Qt 文件处理
Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录可以使用QDir.监视文件和目录变化可以使用QFileSystemWatcher.
读写文本文件QFile类提供了读写文件的接口,QFile类可以读写文本文件,二进制文件和Qt资源文件,也可以使用更方便的QTextStream,QDataStream类读取文本文件和二进制文件,要打开一个文件,可以在构造函数中指定文件名,也可以在任何时候使用setFileName()函数设置文件名,打开文件使用open函数,关闭文件使用close函数。QFile中可以使用QIODevice中继承的readLine()函数读写文本文件的一行。如:QFile file("zeki.txt");if(file.open(QIODevice::ReadOnly)){char buffer[2048];qint 64 lineLen=file.readLine(buffer,sizeof(buffer));if(lineLen!=-1){qDebug& }}如果读取成功,readLine返回实际读取的字节数,如果读取失败则返回-1QTextStream提供了更为方便的接口来读写文本,QTextStream可以操作QIODevice,QByteArray,QString.QTextStream使用流操作符,可以方便地读写单词,行和数字。为了产生文本,QTextStream提供了填充,对齐和数字格式化的格式选项。如QFile data("test.txt");if(data.open(QFile::WriteOnly|QFile::Truncate)){QTextStream out(&data);out& }QTextStream的格式化函数----------------------------------------------qSetFieldWidth(int width) 设置字段宽度qSetPadChar(QChar ch) 设置填充字符qSetRealNumberPrecision(int precision) 设置实数精度----------------------------------------------在QTextStream中使用的默认编码是QTextCodec::codecForLocal()函数返回的编码,同时能够自动检测Unicode。也可以使用QTextStream::setCodec(QTextCodec *codec)函数设置的流编码。
操作二进制文件QDataStream类提供了将二进制文件串行化的功能,QDataStream实现了c++基本数据类型的串行化,如char,short,int char* 更复杂的数据类型串行化通过将数据类型分解为基本的数据类型来完成。下面用来写二进制数据到数据流。QFile file("binary.dat");file.open(QIODevice::WriteOnly);QDataStream out(&file);out& out&&(qint32)42&&(qint32)96;将上面写入的文件读入的过程为:QFile file("binary.dat");file.open(QIODevice::ReadOnly);QDataStream in(&file);QSqint32 x,y;in&&str&&x&&y;每一个条目都可以定义的二进制格式写入文件,Qt中的很多类型,包括QBrush,QColor,QDateTime,QFont,QPixmap,QString,QVariant等都可以写入数据流。
如果需要读取原始数据,可以使用readRawData()读取数据到预先定义好的char *缓冲区,写原始数据使用writeData(),读写原始数据需要对数据进行编码和解码。下面例子演示了使用QDataStream进行读写文件的过程。#include#includeint main(int argc,char **argv){QCoreApplication app(argc,argv);QFile file("binary.file");file.open(QIODevice::WriteOnly|QIODevice::Truncate);QDataStream out(&file);out& out& out&&(qint32)21;file.close();file.setFileName("binary.file");if(!ifle.open(QIODevice::ReadOnly)){cout&&"打开文件错误!";return 1;}QDataStream in(&file);QSQDqint32in&&name&&birthday&&qDebug()& cout& qPrintable(birthday.toString("yyyy MMMM dd dddd"));file.close();return 0;}在例子中,QDataStream类写入了姓名(QString),生日(QDate),和年龄(qint32)三个数据,读取时使用相同的类型读出。QDataStream可以读取任意以QIODevice为基类生成的对象产生的数据。如QTcpSocket,QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端写入数据,另一端使用QDataStream读取数据,这样就免去了繁琐的高低端字节转换过程。
实际应用中有时可能需要使用临时文件,Qt中提供QTemporaryFile类来提供临时文件。QTemporayFile可以安全地创建一个第一无二的临时文件。临时文件通过open()来创建。Qt可以保证临时文件不会重复。在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后还可以打开,只要临时文件对象还没有销毁,临时文件就一直存在并由QTemporaryFile内部保持打开。系统的临时目录可以通过QDir::tempPath()来获取,unix/linux系统上的临时目录通常时/temp在windows上通常是TEM/TMP指定
目录操作和文件管理
QDir类具有存取目录结构和内容的能力。使用QDir可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可以存取Qt的资源文件。Qt使用/作为通用的目录分割符和URL路径分隔符。Qt可以使用相对路径和绝对路径指向一个文件,isRelative()和isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。将相对路径转换为绝对路径使用makeAbsolute()函数。目录路径可以通过path()函数返回,通过setPath()函数设置新路径,绝对路径使用absolutePath()返回。目录名可以使用dirName()返回。目录的路径可以通过cd() cdUp()改变,可以使用mkdir()创建目录,rename()改变目录名。判断目录是否存在可以使用exists(),目录的属性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()来获取,目录下有很多条目,包括文件,目录和符号链接,总的条目数可以使用count()来统计。entryList()可以返回目录下所有条目组成的字符串链表,文件可以使用remove()函数删除,rmdir()删除目录。
linux du命令
int main(int argc, char **argv)
QCoreApplication app(argc,argv);
QStringList args=app.arguments();
if(args.count()&1)
path=args[1];
path=QDir::currentPath();
qDebug()& du(path);
qint64 du(const QString &path)
QDir dir(path);
qint64 size=0;
foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
size+=fileInfo.size();
foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
size+=du(path+Dir::separator()+subDir);
char unit=\'B\';
if(curSize&1024)
curSize/=1024;
unit=\'K\';
if(curSize&1024)
curSize/=1024;
unit=\'M\';
if(curSize&1024)
curSize/=1024;
unit=\'G\';
函数du()中,entryInfoList(QDir::Files)函数返回文件信息,然后根据这些信息计算文件大小,接下来判断是否有子目录,如果有则递归计算。dir.etnryList(QDir::Dirs|QDir::NoDotAndDotDot)返回所有子目录并过滤掉. .. 目录。由于windows(),linux平台/ \差异,使用QDir::separator()函数来返回特定平台的目录分隔符。另外QDirIterator可以完成
枚举目录的功能,Qt4.3还引入了文件搜索前缀的概念,文件搜索前缀时至少由两个字符组成,用来搜索指定文件的路径。
QDir::setSearchPaths("docs",QStringList("c:\My Docments"));
QDir::addSearchPaht("Docs",QStringList("D:|Documents"));
QFile file("docs::qt4.doc");
这样就可以在两个目录中查找。
QFileInfo类提供了与系统无关的文件信心,它能提供文件名和路径,存取权限,以及文件是否为目录或符号链接,文件大小,以及最后修改/读取的时间等。QFileInfo也能从资源中获取信息。QFileInfo可以使用相对路径或绝对路径。文件名可以在QFileInfo的构造函数中传递,也可以使用setFile()函数指定,要判断一个函数是否存在,使用exits()函数,文件大小可以通过size()函数获取,文件类型可以通过isFile(),isDir(),isSymLink()来获取,symLinkTarget()函数返回符号链接所指向的真正文件名。QFileInfo提供refresh函数刷新文件信息,如果需要QFileInfo每次从文件系统读取信息,二不是从缓存读取,可以使用setCaching(false)关闭缓存。文件名和目录可以通过path()和fileName()分解,fileName()返回的部分可以通过baseName()和extension()来获得主文件名和扩展文件名,文件的操作日期可以通过created(),lastModified()和lastRead()获取,文件的存取权限可通国isReadable,isWriteable(),isExcutetable()获取,文件的属主可以通过owner(),ownerId,group(),groupId()获取,文件的权限和属主也可以通过 permission()一起读取。
监视文件系统的变化
在Qt中可以使用QFileSystemWatcher类来监视文件和目录的改变.使用addPath()函数来监视指定的文件和目录,如果需要监视多个目录,使用addPaths()来加入监视,如果要一处不需要监视的目录,可以使用removePath(),removePaths()函数.当监视的文件被修改或删除时,产生一个fileChanged()信号,如果被监视的目录被修改或删除,产生directoryChanged()信号,下例实现了监视指定目录的功能.
#Include"Msg.h"
int main(int argc,char **argv)
QApplication app(argc,argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale())
msg.show();
return app.exec();
Msg::Msg()
font.setPointSize(24);
setFont(font);
QStringList args=qApp-&arguments();
if(args.count()&1)
path=args[1];
path=QDir::currentPath();
label=new QLabel();
label-&setText(tr("监视的目录:")+path);
QVBoxLayout *layout=new QVBoxL
layout-&addWidget(label);
setLayout(layout);
fsWatcher.addPath(path);
connect(&fsWatcher,SIGNAL(directoryChanged(QString)),this,SLOT(directoryChanged(QString)));
在构造函数中读取命令指定的目录作为监视目录,如果没有指定则监视当前目录,使用connect()函数将目录的directroyChanged()信号和响应函数连接.
void Msg::directoryChanged(QString path)
QMessageBox::information(NULL,tr("目录变化"),path);
Qt的QtDir,QFile,QFileInfo类在内部都使用一个类,QAbstractFileEngine.通过继承QAbstractFileEngine类,可以编写自己的文件处理函数,然后继承QAbstractFileEngineHander类注册自己的文件引擎,然后这样就可以使用自己的文件读取引擎了.QAbstractFileEngineHandler是创建QAbstractFileEngine的类工厂.当打开一个文件时,Qt通过内部注册的文件引擎链表,选择合适的文件引擎并创建相应的引擎对象.为了安装一个特定的文件引擎,必须继承QAbstractFileEngineHandler并实现create()函数.实例化引擎时Qt自动注册该引擎,最后注册的引擎比之前注册的优先级高.
如果想读取tar文件的引擎,可以从QAbstractFileEngineHandler类继承
class TarEngineHandler:public QAbstractFileEngineHandler
QAbstractFileEngine *create(const QString &fileName)
create()函数返回TarEngine对象,TarEngine是文件引擎,时真正的文件处理类.
QAbstractFileEngine *TarEngineHandler::create(const QString &fileName) const
return fileName.toLower().endsWith(".tar")?new TarEngine(fileName):0;
原文链接:
QT读取TXT文件显示中文
在XP下写入你想要的中文,注意保存的时候保存为UTF-8格式,其它格式的话就要看你的
QT了,反正我的QT只能支持UTF-8格式的了!什么GB18030,GBK、GB1232之类的,我的QT都没有办法运行。应该是没有这个格式,运行的时候返回一个空头指针!
在XP系统里保存文件是采用UTF16来保存的,呵呵,就是一个中文的宽度哦!唧唧!所以我们就可以直接读取了!但是最重要的是,输出流一定要设置,否则不能正常显示!
简单程序如下:
QTextCodec *code=QTextCodec::codecForName("utf8");//本人采用的是UTF8格式显示的
QFile file("/file.txt");
file.open(IO_ReadOnly);
QTextStream stream(&file);
stream.setCodec(code);//输出流的设置--------必须嘀
while(stream.atEnd()==0)
label -&setText(stream.readLine());
就这样就可以把文本文件里的内容轻松显示出来了哦!
虽然C++标准中有了文件读取的相关类,也很好用,但是在涉及到QT编程的时候却用起来不方便了,因为QT本身很多组件都是关联的自身的QString类 型的字符串,所以再用C++本身String类型的时候就不是那么方便了,需要进行转化,这样给程序带来了复杂度,同时也带来了转化的开销,所以如果用 QT开发,可以就用它本身所带的这些类型进行处理,形成一个系统,便于数据在程序之中的交互和共用。
QT很好,但是在处理中文或者其他语言的时候要注意编码格式,如果没有注意,读取文件的时候可能读出来的就是乱码或者干脆程序就死掉了,这是我们所不愿意看到的,下面就讲讲怎么样通过QT的类来读取中文文件。
我们需要用到几个头文件中的类:
QString类提供了一个Unicode文本和经典的C以零结尾的字符数组的抽象。
QString使用隐含共享,这使它非常有效率并且很容易使用。
所有的QString的方法都使用const char *参数,const char *被解释为经典的C风格的以零结尾的ASCII字符串。所以const char *参数为0是合法的。如果const char *不是以零结尾的,结果是不确定的。把经典的C字符串复制到QString的函数将不会复制结尾的0字符。QString的QChar数组(可以通过 unicode()返回)通常不以零结尾。如果你需要把QString传递到一个需要C的以零结尾的字符串,请使用latin1()。
没有分配任何东西的QString是零,也就是长度和数据指针都为0。引用空字符串(&&,一个单一的'\0'字符)的QString是空。零和空这两个 QString在方法中都是合法的。把(const char *) 0赋值给QString给定了一个零QString。为了方便,QString::null是一个零QString。当排序的时候,空字符串在最前面,然后是非空字符串,然后才是零字符串。我们建议使用if ( !str.isNull() ),而不是if ( !str )来检测非零字符串,关于解释说明也可以参考operator!()。
注意如果你发现你正在混合使用QCString、QString和QByteArray,这将会导致很多不必要的复制并且也许会预示着你正在处理的真实自 然数据是不确定的。如果数据是以零结尾的八位数据,请使用QCString;如果它是没有结尾的(也就是包含0)八位数据,请使用QByteArray;&如果它是文本,请使用QString。
字符串列表可以使用QStringList类来处理。你可以使用QStringList::split()来把一个字符串分割为一个字符串列表,并且可以 使用QStringList::join()把一个字符串列表连接成一个使用随意间隔符的字符串。你也可以使用QStringList::grep()从 一个字符串列表中获得包含特定子字符串或者包含匹配特定的regex的字符串列表。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QFile类是一个操作文件的输入/输出设备。
QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用,但是如果和QDataStream或QTextStream一起使用将更加方便。
文件名通常可以通过构造函数来传递,但也可以使用setName()来设置。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。
文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进 行读写,但你也可以使用readBlock()和readLine()来读,使用writeBlock()来写。QFile也支持getch()、 ungetch()和putch()。
size()可以返回文件的大小。你可以通过使用at()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾,atEnd()返回真。handle()返回文件句柄。
这里是一个使用QTextStream来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。
QFile file( "file.txt" );
if ( file.open( IO_ReadOnly ) ) {
QTextStream stream( &file );
int n = 1;
while ( !stream.eof() ) {
line = stream.readLine(); // 不包括&\n&的一行文本
printf( "=: %s\n", n++, line.latin1() );
file.close();
写文本也很容易(假设我们有一个行的字符串列表要写):
QFile file( "file.txt" );
if ( file.open( IO_WriteOnly ) ) {
QTextStream stream( &file );
for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
stream && *it && "\n";
file.close();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QTextStream
QTextStream类提供了使用QIODevice读写文本的基本功能。
文本流类的功能界面和标准的C++的iostream类非常相似。iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上,而iostream只能操作一个不能被继承的FILE *指针。
Qt提供了几个和iostream相似的全局函数:
bin设置QTextStream来读/写二进制数字
oct设置QTextStream来读/写八进制数字
dec设置QTextStream来读/写十进制数字
hex设置QTextStream来读/写十六进制数字
endl强制换行
flush强制QIODevice刷新任何被缓存的数据
ws作为任何可用的控制符(在输入的时候)
reset重新设置QTextStream为它的缺省模式(请见reset())
qSetW(int)设置字段宽度作为指定参数
qSetFill(int)设置填充字符作为指定参数
qSetPrecision(int)设置精确度作为指定参数
警告:默认情况下,QTextStream在读取流的时候,会自动地检测流中的数字是十进制、八进制、十六进制或者二进制格式。具体情况是,一个以&0&为开头的数字是八进制的,比如顺序为&0100&将会被解释为64。
QTextStream类读写文本,它不适合处理二进制数据(而QDataStream是适合的)。
默认情况下,输出的是使用本地8位编码后的Unicode文本(比如,QString)。这些可以使用setEncoding()方法进行改变。对于输 入,QTextStream会自动检测标准Unicode&字节顺序标记的&文本文件,否则会使用本地8位编码。
QIODevice在构造函数中被设置,或者之后在setDevice()中使用。如果输入到达了atEnd(),返回真。数据可以使用 operator&&()重载操作符读到适当类型的变量中,或者使用read()把它作为整个部分读到一个单一的字符串中,或者使用 readLine()把一次读一行。使用skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()来设置流的标记。这个 流也支持width()、precision()和 fill(),使用reset()可以重新恢复默认设置。
也可以参考QDataStream、输入/输出和网络和文本相关类.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
QTextCodec
QTextCodec 类提供文本编码之间的转换。
QT使用Unicode来存储,绘制以及操作字符串。在很多情况下,你可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在 Shift-JIS或者 ISO2022的文件中,而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec 类集合来从Unicode格式转化到相应的格式。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
QFile file("test.txt");
if (file.open(IO_ReadOnly|IO_Raw))
QTextStream floStream(&file);
QTextCodec *codec=QTextCodec::codecForName("GBK");
floStream.setCodec(codec);
while ( floStream.atEnd()==0 )
line = codec-&fromUnicode(floStream.readLine());
qWarning(line);
file.close();
代码中的主要改动就是黄底的部分
意思就是创立一个中文GBK编码样式,然后按照这种方式来把读入的文件流进行重新编码,这样中文就可以顺利输出了,不信你可以试一试
补上这两句就可以了显示中文了
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")) ;
http://blog.sina.com.cn/s/blog_a401a1ea0101fgvv.html
Views(...) Comments()

我要回帖

更多关于 windows7无法验证数字签名 的文章

 

随机推荐