当前位置:首页 > 网络编程 > 软件语言 > C语言 > 关于QT3的新手程序

关于QT3的新手程序

点击次数:163 次 发布日期:2008-12-13 12:21:59 作者:源代码网
源代码网推荐 最近看了一篇很老的文章,关于QT3的一些新手程序。很多介绍里面或多或少都有一些错误,在此修正后奉献出来。

程序的功能很简单,就是进行一些文件的操作:

假如说我有两个文件,分别是文件A,文件B。其中文件A中的前n个字节的数据都为0,这样的文件A我把它视为一个“坏文件”。我要做的就是在文件B中找到A的值为0的数据所对应的数据,并用它替换掉A的“坏数据”。为了保护现场,我将替换好的A保存为文件C。

之所以开发这个程序,是因为最近在下载电视剧的时候,常常发现出现“渲染失败”而不能播放的文件。而补救方法之一就是用一个好的文件替换那个坏了的文件的头n个值为0的字节数据。这个目的现在已经达到了(至少我已经拿他修复了几集电视剧)。

对文件的操作,我使用的是STL中的“流”,然后GUI就使用了现在那个喊得很响的跨平台的开源c++项目--QT。
首先是搭建环境。其实也挺简单的,现在大家都喜欢DEV-C++和Qt4.2结合使用吗,我这里也搭建了一个同样的环境。使用Qt+Dev cpp环境配置这篇随笔中提到了那个老外的模板,拷贝到DEV-C++目录下的Template目录下,就可以了。然后打开开发环境,就可以创建QT项目了。当然如果实在是喜欢用记事本开发,也可以完成代码之后,用命令行编译、链接程序,在帮助文档里面说的很清楚,在你的src目录下依次执行


qmake -project
qmake
make

就可以了。当然更深入的情况下,往往需要对生成的makefile做点手脚。

现在回到DEV-C++。

打开程序,新建项目

然后确定,创建项目,就生成了我的qt项目。

nbsp;

因为我的qt程序中还需要对于QT3的支持,所以需要在编译命令中添加对QT3的支持。如下:

-O2 -O2 -frtti -fexceptions -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"G:/Qt/4.3.0/include/QtGui" -I"G:/Qt/4.3.0/include/QtCore" -I"G:/Qt/4.3.0/include" -I"." -I"G:/Qt/4.3.0/include/Qt3Support" -I"G:/Qt/4.3.0/include/ActiveQt" -I"tmpmoc elease_shared" -I"." -I"G:Qt4.3.0mkspecswin32-g++"

注意黑体部分就是新添加的。

当然也可以修改一下模板,让以后的所有程序都具备对于QT3的支持。

不光要修改编译指令,还需要修改链接指令:

-mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl, -Wl, -Wl,-subsystem,windows -L"G:Qt4.3.0lib" -L"G:Qt4.3.0lib" -lmingw32 -lqtmain -lQtCore4 -lQtGui4 -lQt3Support4

好了,这样就提供了QT3的支持。

首先,我需要创建文件选择窗口,在这里,我创建两个打开文件窗口和一个保存文件窗口:

1 QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
2 QApplication app(argc, argv);
3 QWidget w;
4 QString sErrorFile = Q3FileDialog::getOpenFileName(
5 "/",
6 "RMVB (*.rmvb)",
7 &w,
8 "open file dialog",
9 "选择要修复的文件");
10 QString sTemplateFile=Q3FileDialog::getOpenFileName(
11 "/",
12 "RMVB (*.rmvb)",
13 &w,
14 "open file dialog",
15 "选择参照文件");
16 QString sOutputFile=Q3FileDialog::getSaveFileName(
17 "/",
18 "RMVB (*.rmvb)",
19 &w,
20 "open file dialog",
21 "选择输出文件");

注意第一句让我的程序能够支持中文。
而要使用Q3FileDialog,则要添加Q3支持。
对于文件操作类,这里就不详细列出代码了.类图如下:

因为文件操作是一个比较耗费资源的操作,所以这里我把它放到一个线程里面去。我创建了一个类MainOperation,让它从QThread继承,并处理有关文件的操作:


1 class MainOperation:public QThread
2 {
3 Q_OBJECT
4 public:
5 MainOperation(QString errorFile,QString templateFile,QString outputFile)
6 {
7
8 _errorFile=copyQStringToCharArray(errorFile);
9 _templateFile=copyQStringToCharArray(templateFile);
10 _outputFile=copyQStringToCharArray(outputFile);
11
12 }
13 ~MainOperation()
14 {
15 delete[] _errorFile;
16 delete[] _templateFile;
17 delete[] _outputFile;
18 }
19 protected:
20 void run()
21 {
22 FileWriter fw1(_errorFile);
23 FileReviser fr(_templateFile);
24 fw1.AppendReviser(&fr);
25 emit fileSizedRecognized(fw1.GetFileSize());
26 while(!fw1.IsOK())
27 {
28 fw1.Save(_outputFile);
29 emit posChanged(fw1.GetPos());
30 }
31 emit finished();
32 }
33 signals:
34 void fileSizedRecognized(int fileSize);
35 void posChanged(int pos);
36 void finished();
37
38 private:
39 char * copyQStringToCharArray(QString qstr)
40 {
41 QByteArray array=qstr.toAscii ();
42 char* resultChar=new char[strlen(array.data())];
43 strcpy(resultChar,array.data());
44 return resultChar;
45 }
46 char* _errorFile;
47 char* _templateFile;
48 char* _outputFile;
49
50 };


因为一直在搞c#和java的开发,所以最近写出来的c++代码都是inline的,这确实不符合c++的标准编程习惯。 源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华