yafeilinux 发表于 2013-10-28 21:46:09

《Qt Creator快速入门》第二版主要更新内容

没有涉及到操作或编程的修改不再列出。

第1章
1.1.1下载软件
Qt使用4.8.5版本地址:http://download.qt-project.org/official_releases/qt/4.8/4.8.5/下载文件:qt-win-opensource-4.8.5-mingw.exeQt Creator使用2.8.0版本地址:http://download.qt-project.org/official_releases/qtcreator/2.8/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:244          #5          #-------------------------------------------------6         7          QT      += core gui8         9          greaterThan(QT_MAJOR_VERSION,4): QT += widgets10      11       TARGET = helloworld12       TEMPLATE = app13      14      15       SOURCES += main.cpp\16               hellodialog.cpp17      18       HEADERS+= hellodialog.h19      20       FORMS    += hellodialog.ui21      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+O新建文件或项目Ctrl+N
在外部编辑器中打开Alt+V,Alt+I选择全部Ctrl+A
删除Delete剪切Ctrl+X
复制Ctrl+C粘贴Ctrl+V
重做Ctrl+Y打印Ctrl+P
保存Ctrl+S保存所有文件Ctrl+Shift+S
关闭窗口Ctrl+W关闭所有文件Ctrl+Shift+W
关闭当前文件Ctrl+F4返回Alt+向左键
前进Alt+向右建转到行Ctrl+L
历史中下个打开的文件Ctrl+Shift+Tab跳转到其他分栏Ctrl+E,O
历史中先前打开的文件Ctrl+Tab定位Ctrl+K
切换到欢迎模式Ctrl+1切换到编辑模式Ctrl+2
切换到设计模式Ctrl+3切换到调试模式Ctrl+4
切换到项目模式Ctrl+5切换到分析模式Ctrl+6
切换到帮助模式Ctrl+7问题输出窗格Alt+1
搜索结果窗格Alt+2应用程序输出窗格Alt+3
编译输出窗格Alt+4其他输出窗格Alt+相应数字
激活书签窗口Alt+M激活文件系统窗口Alt+Y
激活打开文档窗口Alt+O最大化输出窗格Alt+9
输出窗格中下一个条目F6输出窗格中上一个条目Shift+F6
激活项目窗口Alt+X全屏Ctrl+Shift+F11
显示边栏Alt+0撤销Ctrl+Z
切换到编辑模式Esc退出Qt CreatorCtrl+Q




编辑相关操作的键盘快捷键



操作快捷键操作快捷键
选中的文字自动缩进Ctrl+I折叠Ctrl+<
展开Ctrl+>当前范围触发自动补全Ctrl+空格
复制行Ctrl+Insert向下复制本行Ctrl+Alt+向下键
向上复制行Ctrl+Alt+向上键从剪贴板历史中粘贴Ctrl+Shift+V
剪切行Shift+Delete合并行Ctrl+J
在当前行之前插入行Ctrl+Shift+Enter在当前行之后插入行Ctrl+Enter
缩小字号Ctrl+-增大字号Ctrl++
重置字号Ctrl+0使用Vim风格编辑Alt+V,Alt+V
分栏Ctrl+E,2左右分栏Ctrl+E,3
在新窗口打开Ctrl+E,4显示进度条细节Alt+Shift+0
删除所有分隔Ctrl+E,1删除当前分隔Ctrl+E,0
选择全部Ctrl+A移到段落结尾
移到段落开头Ctrl+[选中到段落末尾Ctrl+}
选中到段落开头Ctrl+{当前行下移Ctrl+Shift+向下键
当前行上移Ctrl+Shift+向上键当前范围触发快速修正Alt+Enter
段落重新折行Ctrl+E,R选择段落上移Ctrl+U
开启文字折行Ctrl+E,Ctrl+W切换选中区域的注释Ctrl+/
标示空白Ctrl+E,Ctrl+V调整大小(设计模式)Ctrl+J
栅格布局(设计模式)Ctrl+G水平布局(设计模式)Ctrl+H
垂直布局(设计模式)Ctrl+L预览(设计模式)Alt+Shift+R
切换书签Ctrl+M下个书签Ctrl+.
上个书签Ctrl+,取得代码片段Alt+C,Alt+F
粘贴代码片段Alt+C,Alt+P搜索被使用的地方Ctrl+Shift+U
跟踪光标位置的符号F2重命名光标位置符号Ctrl+Shift+R
在声明和定义间切换Shift+F2打开类型层次结构Ctrl+Shift+T
切换头/源文件F4选中文本改为小写Alt+U
选中文本改为大写Alt+Shift+U运行检查Ctrl+Shift+C
查找/替换Ctrl+F查找下一个F3
查找前一个Shift+F3查找下一个(选中的)Ctrl+F3
查找前一个(选中的)Ctrl+Shift+F3查找并替换Ctrl+=
打开高级查找Ctrl+Shift+F录制宏Alt+(
停止录制宏Alt+)播放最近的宏Alt+R
显示Qt Quick工具栏Ctrl+Alt+空格FakeVim中执行操作Alt+V,相应数字



调试相关操作的键盘快捷键



操作快捷键操作快捷键
开始或继续调试F5停止调试Shift+F5
单步跳过F10单步进入F11
单步跳出Shift+F11切换断点F9
运行到选择的函数Ctrl+F6执行到行Ctrl+F10
掉转方向F12




项目相关操作的键盘快捷键



操作快捷键操作快捷键
构建项目Ctrl+B构建所有项目Ctrl+Shift+B
新项目Ctrl+Shift+N打开项目Ctrl+Shift+O
打开构建套件选择器Ctrl+T运行Ctrl+R




帮助相关操作的键盘快捷键



操作快捷键操作快捷键
上下文相关帮助F1添加书签Ctrl+M
帮助模式下激活书签Ctrl+Shift+B帮助模式下激活目录Ctrl+Shift+C
帮助模式下激活索引Ctrl+Shift+I帮助模式下激活搜索Ctrl+Shift+/
下一页Alt+向右键上一页Alt+向左键



注:Ctrl+E,2等格式的快捷键是先同时按下Ctrl和E键,释放后再按下数字键2 。






jeeyoo 发表于 2013-10-29 01:18:03

什么时候上市?:):):):):):):)

yafeilinux 发表于 2013-10-29 08:51:40

jeeyoo 发表于 2013-10-29 01:18 static/image/common/back.gif
什么时候上市?

12月初吧。如果已经买了第一本了,就不用再买了,只是修订性再版!

yafeilinux 发表于 2013-10-30 16:44:57

jeeyoo 发表于 2013-10-29 01:18 static/image/common/back.gif
什么时候上市?

可以等的。不过如果急着学习也可以先买这个,后面会把二版更新内容和源码都公布的。而且二版具体上市时间也不好确定,出版社给的时间是12月初,但是真正可以买到也许会更晚。

lengyuegg 发表于 2013-11-5 19:55:12

等第二版再买:):):):):):):)

jakes 发表于 2013-11-7 09:57:54

会增加Qt5的新东西吗?建议QML方面做详细深入的讲解。如果开发实战那本对QML有更深入的讲解,会再入一本,虽然已经都有了。。。。

xCamel 发表于 2013-11-11 08:59:10

希望能出版一本介绍Qt5的书,发现Qt4的程序没法在Qt5中直接运行,两个版本区别蛮大的

yafeilinux 发表于 2013-11-12 09:25:45

jakes 发表于 2013-11-7 09:57 static/image/common/back.gif
会增加Qt5的新东西吗?建议QML方面做详细深入的讲解。如果开发实战那本对QML有更深入的讲解,会再入一本, ...

这个书只是讲Qt 4的,Qt 5以后计划会再单独出一本。

yafeilinux 发表于 2013-11-12 09:26:07

xCamel 发表于 2013-11-11 08:59 static/image/common/back.gif
希望能出版一本介绍Qt5的书,发现Qt4的程序没法在Qt5中直接运行,两个版本区别蛮大的 ...

嗯。这个已经在计划中了。

jqthely 发表于 2013-11-13 11:26:14

赶紧出第二版   正等着买呢谢谢

yafeilinux 发表于 2013-11-13 11:37:26

jqthely 发表于 2013-11-13 11:26 static/image/common/back.gif
赶紧出第二版   正等着买呢谢谢

呵呵,出版社正抓紧时间排版呢,他们给的时间是十二月初。

jqthely 发表于 2013-11-13 20:15:33

好的谢谢   我相信第二版一定很棒

yafeilinux 发表于 2013-11-14 14:12:05

jqthely 发表于 2013-11-13 20:15 static/image/common/back.gif
好的谢谢   我相信第二版一定很棒

如果你没看过第一版,可以这么说。

不过要是买过第一版,就没有必要买第二版了,因为没有实质性的改动,只是版本修订!

venliong 发表于 2013-11-16 12:58:57

????????????? ????????????????????

yafeilinux 发表于 2013-11-16 15:52:04

venliong 发表于 2013-11-16 12:58 static/image/common/back.gif
????????????? ????????????????????

具体更新内容,会在第二版正式出版的时候更新出来的。

jinlingren1122 发表于 2013-11-21 11:12:15

yafei感谢你的付出,所以我们收获啊!期待你的更新。发现写软件啊,还是真是个长久战,不过我还是从您的第一版书中收获不少。感谢yafei为中国软件做出的贡献。

carpho 发表于 2013-11-21 16:52:45

老师的很多QT4的程序在QT5.1中编译提示错误 期待QT5的教程

yafeilinux 发表于 2013-11-22 10:07:25

carpho 发表于 2013-11-21 16:52 static/image/common/back.gif
老师的很多QT4的程序在QT5.1中编译提示错误 期待QT5的教程

简单的可以先看下:
http://www.qter.org/forum.php?mod=viewthread&tid=903

lengyuegg 发表于 2013-12-11 11:06:23

咋推迟了呢:'(:'(:'(:'(:'(:'(

yafeilinux 发表于 2013-12-11 15:25:34

lengyuegg 发表于 2013-12-11 11:06 static/image/common/back.gif
咋推迟了呢

出版社的问题,可能是因为年底了!
页: [1] 2 3
查看完整版本: 《Qt Creator快速入门》第二版主要更新内容