《Qt Creator 快速入门》首先介绍了项目目录中各个文件的含义。建立一个最简单的helloworld程序,则helloworld.pro是项目文件,其中包含了项目相关信息、helloworld.pro.user包含了与用户有关的项目信息、hellodialog.h是类的头文件、hellodialog.cpp是类的源文件、main.cpp包含了main()主函数、hellodialog.ui设计师设计的界面对应的界面文件。然后建立一个空的Qt项目,再添加main.cpp文件,代码如下:
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QDialog w;
w.resize(400, 300);
QLabel label(&w);
label.move(120, 120);
label.setText(QObject::tr("Hello World! 你好Qt!"));
w.show();
return a.exec();
}
Helloworld.pro是自动生成的。代码如下:
SOURCES += \
Main.cpp
编译时会报错:C1803:Cannot open include file:’QApplication’ :No such file or directory。
其实书中对.pro文件的介绍太笼统,.pro文件用来设置编译或者链接的变量,以便用qmake生成相应的Makefile文件。
TEMPLATE:这个变量是用来定义你的工程将被编译成什么模式。如果没有这个设置,系统将默认编译为application。
TEMPLATE=app表示这个project将被编译成一个应用程序(application)
lib(生成库的Makefile)
subdirs(生成有多级目录管理的Makefile),
vcapp,vclib,vcsubdirs(对应Windows下面VC)
TARGET:生成最后目标的名字
DESTDIR:指定生成目标的路径
DEPENDPATH:工程的依赖路径
INCLUDEPATH:这个用来指定工程要用到的头文件路径
SOURCES:工程需要的源文件
HEADERS:工程所需要的头文件
FORMS:工程要用到的ui文件(ui文件时用QT设计器生成的)
LIBS:加载动态库。LIBS+=./mitab/libmitab.so
TRASHLATIONS:加载要用到的语言翻译*.ts文件
RESOURCES:加载要用到的资源*.qrc文件。
CONFIG:告诉qmake应用程序的配置信息。
这个变量可以用来指定是生成debug模式还是release模式,也可以都生成。
也可以用来打开编译器警告(warn_on输出尽可能多的警告信息)或者
关闭(warn_off -编译器会输出尽可能少的警告信息)。还可以用来配置要Qt加载库。
想要qt+多线程:CONFIG+=qt thread
注意:这里使用+=,而不是=,是因为我们希望添加我们的配置选项到任何一个已经存在的文件中。
Eg:
CONFIG+=debug_and_release
CONFIG(debug,debug|release){
TARGET= hello
DESTDIR= ./debug
}else{
TARGET= hello
DESTDIR= ./release
}
UI_DIR:UIC将ui转化为头文件所存放的目录
RCC_DIR:RCC将qrc文件转化为头文件所存放的目录
MOC_DIR:MOC命令将含Q_OBJECT的头文件转换为标准的头文件存放的目录
OBJECTS_DIR:生成的目标文件存放的目录
DEFINES:应用程序所需的额外的预处理程序定义的列表#在.h文件中就可以使用:#ifdefinexx_xx_xxx
LIBS += -L folderPath //引入的lib文件的路径 -L:引入路径
Release:LIBS+= -L folderPath // release 版引入的lib文件路径
Debug:LIBS+= -L folderPath // Debug 版引入的lib文件路径
RC_FILE = xxx.icns //程序图标
QT是跨平台的,所以我们在不同的平台上用同一个pro文件,这要加入有关平台的信息。
windows是win32,Linux平台是unix。
Eg:
在Windows和Linux的动态库文件格式是不一样的。一个是lib文件一个是so文件
win32:LIBS+= ./mitab/mitab_i.lib
unix:LiBS+= ./mitab/libmitab.so
eg:
win32{
SOURCES+= hello_win.cpp //win平台
}
unix{
SOURCES+= hello_win.cpp //unix/linux平台
}
以通过在其它任何一个变量的变量名前加$$来把这个变量的值分配给当前的变量。例如:
MY_DEFINES= $$DEFINE #将DEFINE的值分配给MY_DEFINES
再回到我们的问题上。我们需要再.pro中加入QT += widgets。
关于为什么要在.pro里面加上Qt += widgets知乎上有个很好的回答:
在pro里写 qt+=widgets 表示引入QtWidget这个module,qmake会在帮你生成makefile的时候,设置好include path 和 lib path,在link时候设置好libs。
而仅在源代码里 include <QApplication>仅是引入声明,但是没有lib,所以链接时会出错。
当然,我们可以批评C++这种源自上世纪70年代的头文件和lib分离的设计是过时的不合理的,现代语言基本都采用package管理,用import解决了。
但是我们既然还在用C++,就要接受这种设计,把它搞明白。
此时,会报:C2039: ‘setCodeForTr’: is not a member of ‘QTextCode’。这是因为Qt5取消了QTextCodec::setCodecForTr()和QTextCodec::setCodecForCString()这两个函数。我们先注释掉:
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
label.setText(QObject::tr("Hello World! Qt!"));
这样,程序就可以编译通过并运行了。