没有涉及到操作或编程的修改不再列出。
第1章
1.1.1下载软件
Qt使用4.8.5版本 下载文件:qt-win-opensource-4.8.5-mingw.exe Qt Creator使用2.8.0版本 下载文件:qt-creator-windows-opensource-2.8.0.exe
1.1.2安装软件
先安装Qt Creator 。双击运行qt-creator-windows-opensource-2.8.0.exe,然后按照默认设置安装即可(注意:如果要改变安装目录,那么安装路径中不能有中文)。当Qt Creator安装完成后,双击运行qt-win-opensource-4.8.5-mingw.exe安装Qt框架。整个过程也是按默认设置即可。在MinGW安装(MinGW Installation)界面需要指定MinGW的路径,这里提示需要使用GCC 4.4版本的MinGW。可以到Qter开源社区( www.qter.org)的下载页面下载MinGW,下载的文件是MinGW-gcc440_1.zip,下载完成后需要对其进行解压缩,笔者这里解压缩到了Qt的默认安装目录,如果这里都是使用的默认路径,那么应该填写C:\Qt\mingw,如图1-1所示。
1.2.1运行一个示例程序
现在将Qt Creator 与Qt 库进行连接。选择“工具→选项”菜单项,然后选择“构建和运行”项。因为这里是分别下载安装的Qt 和Qt Creator ,它们并没有自动关联,需要读者手动设置。先设置编译器,点击右上角的“添加”按钮,选择第一项MinGW ,然后添加编译器路径,笔者这里是C:\Qt\mingw\bin\gcc.exe ,完成后点击下面的“应用”按钮保存设置,如图1-3 所示。下面添加Qt 版本,点击右上方的“添加”按钮,然后选择qmake.exe 的路径,笔者这里是C:\Qt\4.8.5\bin\qmake.exe ,完成后再次点击“应用”按钮保存设置,如图1-4 所示。最后到“构建套件(Kit) ”中,可以看到已经有了一个“桌面(默认)”,这里双击它直接进行设置(当然也可以添加一个新的套件再进行设置),名称可以随意设置,这里修改为“Desktop Qt 4.8.5”,表明是Qt 4.8.5 的桌面版;下面编译器一项已经默认选择了前面设置的MinGW ;最后将Qt 版本选择为前面添加的Qt 4.8.5 (4.8.5 )一项。为了以后可以在调试模式进行程序调试,这里需要指定调试器,读者可以到Qter 开源社区(www.qter.org )的下载页面下载调试器,因为笔者使用的是Windows 7 操作系统,所以下载的文件是qtcreator-gdb-7.4-MINGW32_NT-6.1-i686.tar ,读者可以根据自己的系统选择下载,也可以到http://download.qt-project.org/official_releases/gdb/进行下载。下载完成后需要解压缩文件,笔者这里解压缩到了C:\Qt 目录。然后回到Qt Creator 中继续进行设置,点击调试器项后面的“编辑… ”按钮,在弹出的对话框中指定“二进制”路径,笔者这里是C:\Qt\qtcreator-gdb-7.4-MINGW32_NT-6.1-i686\gdb-i686-pc-mingw32.exe 。设置完成后如图1-5 所示。最后点击“确定”按钮保存退出,回到Qt Creator 欢迎界面。
第2章
2.3.1纯代码编写程序与命令行编译
第五,设置显示中文。更改代码如下: 1 #include <QApplication> 2 #include <QDialog> 3 #include <QLabel> 4 #include <QTextCodec> 5 int main(int argc, char *argv[]) 6 { 7 QApplication a(argc, argv); 8 QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); 9 QDialog w; 10 QLabel label(&w); 11 label.setText(QObject::tr("Hello World! 你好Qt!")); 12 w.show(); 13 return a.exec(); 14 } 在第4行添加了QTextCodec类的头文件包含。QTextCodec类提供了文本编码的转换功能。第8行使用了QTextCodec类中的静态函数setCodecForTr(),用来设置QObject::tr()函数所要使用的字符集,就像第11行中所看到的那样,tr()函数可以使用指定的字符集来对文本编码进行转换。这里使用了QTextCodec::codecForName("UTF-8")指定使用“UTF-8”字符集进行编码,读者也可以根据具体环境设置其他字符集。 为了能够显示中文,需要设置字符集,然后使用QObject::tr()函数将字符串进行编码转换。其实tr()函数还可以实现多语言支持,这个在第9章国际化部分将会讲到。需要说明的是,setCodecForTr()函数最好的放置位置就是像程序中这样,放在main()函数中的QApplication对象下面。Qt程序中所有要显示到界面上的字符串最好都使用tr()函数括起来,而对于不是要显示到界面上的字符串中如果包含了中文,可以使用QString()进行编码转换,这需要在主函数中添加如下代码进行设置: QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); 虽然使用这种方法可以很简单地实现中文显示,不过还是建议正规编写代码时全部使用英文,最后使用第9章讲到的国际化的方式来实现中文显示。
2.4.2项目文件
下面来看一下2.1节中建立的helloworld项目的helloworld.pro文件的内容: 1 #------------------------------------------------- 2 # 3 # Project created by QtCreator 2013-08-07T23:10:24 4 # 5 #------------------------------------------------- 6 7 QT += core gui 8 9 greaterThan(QT_MAJOR_VERSION,4): QT += widgets 10 11 TARGET = helloworld 12 TEMPLATE = app 13 14 15 SOURCES += main.cpp\ 16 hellodialog.cpp 17 18 HEADERS += hellodialog.h 19 20 FORMS += hellodialog.ui 21 22 RC_FILE += myico.rc 第1~5行是注释信息,说明这个文件生成的时间。第7行表明了这个项目使用的模块。 core模块包含了Qt非图形用户界面的核心功能,其他所有模块都依赖于这个模块;而gui模块扩展了core模块的图形界面功能。也就是说,如果不需要设计图形界面的程序,那么只需要core模块就可以了,但是如果涉及图形界面,那么就必须包含gui模块。其实所谓的模块,就是很多相关类的集合,比如所有与图形界面有关的类都在gui模块中,读者可以在Qt帮助中查看QtCore Module和QtGui Module关键字。第9行是为了和Qt5兼容添加的一行代码,表明如果是Qt5版本,就添加QT +=widgets一行代码。第11行是生成的目标文件的名称,就是生成的exe文件的名字,默认的是工程的名字,当然也可以在这里改为别的名字。第12行使用app模板,表明这是个应用程序。第15,18和20行分别是工程中包含的源文件、头文件和界面文件。第22行就是添加的应用程序图标的文件。这里这些文件都使用了相对路径,因为都在项目目录中,所以只写了文件名。 这里还要提一下那个在项目文件夹中生成的.pro.user文件,它包含了本地构建信息,包含Qt版本和构建目录等。可以用记事本或者写字板将这个文件打开查看其内容。当使用QtCreator打开一个.pro文件时会自动生成一个.pro.user文件。因为读者的系统环境都不太一样,Qt的安装于设置也不尽相同,所以如果要将自己的源码公开,一般不需要包含这个user文件。如果要打开别人的项目文件,但里面包含了user文件,Qt Creator则会弹出提示窗口,询问是否载入特定的环境设置,这时应该选择“否”,然后选择自己的Qt版本即可,如图2-30所示。
第3章
第49页,修改说明。
先在showChildDialog上右击,在弹出的菜单中选择“重构→Rename Symbol UnderCursor”,或者直接使用
第5章
第103页。 在“这时先运行程序,然后从桌面上将一个文本文件拖入程序中。” 前面添加 “最后进入mainwindow.cpp文件,在构造函数中添加setAcceptDrops(true);一行代码,使主窗口可以接受放下事件。”
第7章
1. 第139页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
2. 第141页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
3. 第143页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
4. 第145页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
5. 第147页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
6. 第149页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
7. 第150页,
将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
将QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 修改为:QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
8. 第153页,将#include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
9. 第154页,将QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 修改为:QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
10. 第166页,删除下面的内容:
当要在表达式中使用中文时,需要在main.cpp文件中添加头文件#include <QTextCodec>,然后再main()函数中添加如下一行代码: QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
第8章
第177页,添加修改内容:
“可以看到,当一个部件获得鼠标焦点后就会显示”更改为:“如果在WindowsXP系统中,当一个部件获得鼠标焦点后就会显示”
第9章
1. 第184页,在“第四步,使用…”这段前面添加一段: 该步也可以通过“工具→外部→Qt语言家→更新翻译(lupdate)”菜单项来快速完成,注意在使用该菜单项之前先保存所有修改过的文件。
2. 第187页,首先删除图9-2,然后添加修改内容:
输出信息如图9-2所示,这表明已经生成了.qm文件。另外在Qt Linguist中也可以使用File→Reelase和File→Release As这两个菜单项来生成当前已打开的.ts文件对应的.qm文件。
更改为:
这样就成功生成了.qm文件。也可以在QtLinguist中使用“文件→发布”和“文件→另外发布为”这两个菜单项来生成当前已打开的.ts文件对应的.qm文件。该步还可以通过Qt Creator的“工具→外部→Qt语言家→发布翻译(lrelease)”菜单项来快速完成。
3. 第188页,添加内容:
这里先加载了.qm文件(使用了相对路径),然后为QApplication对象安装了翻译。注意,这几行代码一定要放到创建部件的代码之前,比如这里放到了“MainWindow w;”一行代码之前,这样才能对该部件进行翻译。另外,有时可能因为部件的大小问题使得翻译后的文本无法完全显示,较好地解决方法就是使用布局管理器。
第12章
第284页,添加内容:
再到myglwidget.cpp文件中先包含#include<GL/glu.h>头文件,然后添加这3个函数的定义
第15章
第319页,将:
#include <QtCore/QCoreApplication> 修改为: #include <QCoreApplication>
将 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 修改为: QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
第17章
1. 第368页,添加内容:
这里还列出了编译驱动器插件和编写自定义的数据库驱动的方法。
更改为:
这里还列出了在各种平台上编译数据库驱动插件和编写自定义的数据库驱动的方法,读者也可以到Qter开源社区(www.qter.org)的书籍页面查看MySQL数据库驱动的编译教程。
2. 第377页,修改代码:
将 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); 两行代码更改为: QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
3. 第386页,修改代码: 将 #include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
4. 第388页,修改代码:
将 QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale()); 修改为:QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
5. 第399页,修改代码: 将 #include<QtCore/QCoreApplication> 修改为:#include <QCoreApplication>
第18章
1. 第405页,修改代码:
将QTextCodec*codec = QTextCodec::codecForLocale(); 修改为: QTextCodec *codec =QTextCodec::codecForName("UTF-8");
2. 第408页,删除内容。
可以输入一个网络文件地址然后点击“下载”按钮将其下载到本地,比如下载华军软件园上的劳拉方块游戏,可以使用如下URL地址:http://zzidc.onlinedown.net:82/down/laolafangkuaijin.rar 。
3. 第409页,修改代码:
ftp = new QFtp(this); ftp->connectToHost("ftp.qt.nokia.com"); ftp->login(); ftp->cd("qt");
修改为:
ftp = new QFtp(this); ftp->connectToHost("ftp.qt-project.org"); ftp->login(); ftp->cd("qt/source");
4. 第412页,修改内容:
text属性改为“ftp.qt.nokia.com”。 修改为: text属性改为“ftp.qt-project.org”。
第19章
1. 第446页,更改代码和内容: 原文: 这里将stopped变量初始化为false。下面添加run()函数的定义: void MyThread::run() { qreal i = 0; while (!stopped) qDebug() << QString("in MyThread: %1").arg(i++); stopped = false; } 这里一直判断stopped变量的值,只要它为false,那么就一直打印字符串。下面添加stop()函数的定义: 更改为: 这里将stopped变量初始化为false。下面添加run()函数的定义: void MyThread::run() { qreal i = 0; while (!stopped) { qDebug() << QString("inMyThread: %1").arg(i); msleep(1000); i++; } stopped = false; } 这里一直判断stopped变量的值,只要它为false,就每隔一秒打印一次字符串。下面添加stop()函数的定义:
2. 第447页,在“19.2.2 同步线程” 前面添加内容如下: 在启动线程时调用了start()函数,然后设置了两个按钮的状态。在终止线程时,先使用isRunning()来判断线程是否在运行,如果是,则调用stop()函数来终止线程,并且更改两个按钮的状态。现在运行程序,按下“启动线程”按钮,查看应用程序输出栏的输出,然后再按下“终止线程”按钮,可以看到已经停止输出了。 还有一种创建线程的方法,就是使用QObject::moveToThread()函数。例如: class Worker : public QObject { Q_OBJECT public slots: voiddoWork(const QString ¶meter) { // ... emitresultReady(result); } signals: voidresultReady(const QString &result); }; classController : public QObject { Q_OBJECT QThreadworkerThread; public: Controller() { Worker*worker = new Worker; worker->moveToThread(&workerThread); connect(&workerThread, SIGNAL(finished()), worker,SLOT(deleteLater())); connect(this, SIGNAL(operate(QString)), worker,SLOT(doWork(QString))); connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString))); workerThread.start(); } ~Controller() { workerThread.quit(); workerThread.wait(); } public slots: voidhandleResults(const QString &); signals: voidoperate(const QString &); }; 这样Worker的doWork()槽中的代码就可以在单独的线程中执行,使用这种方法可以很容易地将一些费时的操作放到单独的工作线程中来完成。可以将任意线程中任意对象的任意一个信号关联到Worker的槽上,不同线程间的信号和槽进行关联是安全的。
附录 Qt Creator键盘快捷键速查
一般操作的键盘快捷键
编辑相关操作的键盘快捷键
调试相关操作的键盘快捷键
项目相关操作的键盘快捷键
帮助相关操作的键盘快捷键
注:Ctrl+E,2等格式的快捷键是先同时按下Ctrl和E键,释放后再按下数字键2 。
|