文档章节

从零开始——使用qmake构建QT项目

乌合之众
 乌合之众
发布于 2015/06/04 15:48
字数 2051
阅读 143
收藏 0

<font size=16px>

#丢弃Qt Create ,自由的写Qt项目

[TOC]

本文由乌合之众lym瞎写,欢迎转载http://my.oschina.net/oloroso


还是先说一下当前的系统环境:Ubuntu 14.04 + Qt5.4 如果没有安装过QT,可以安装下面几个qt软件

sudo apt-get install qt5-default qt5-doc-html qt5-qmake qt5-doc qt5-image-formats-plugins

这只是对qmake使用的一个说明而已。如果一直使用Qt Create来构建工程,很容易让人以为Qt项目必须使用Qt Create来创建。其实我们可以像写普通的C++工程一样,不一定需要IDE,编辑器+编译器即可搞定了。 不过这个有一个缺点,就是如果在connect函数连接信号的槽的时候,即便是槽函数不存在,也能够通过编译

##1. 先来写源代码 必须先写源代码,这个源代码很简单,就是创建一个Widget,然后widget上面有一个PushButton,点击之后弹出一个MessageBox来提示一个*"hello world"*。

###hello.h

#ifndef __HELLO_H_
#define __HELLO_H_

#include <QWidget>

class hello:public QWidget{
	Q_OBJECT
	public:
		explicit hello(QWidget *parent = 0);
		~hello();

public slots:
	//槽函数,处理button单击
	void btn_click();
	private:
};

#endif

#endif

###hello.cpp

#include "hello.h"

#include <QPushButton>
#include <QMessageBox>

hello::hello(QWidget *parent)
	: QWidget(parent){
	
	//创建一个PushButton
	QPushButton * btn = new QPushButton("点击我^-^",this);
	//连接信号和槽
	connect(btn,SIGNAL(clicked()),this,SLOT(btn_click()));

}

void hello::btn_click()
{
	QMessageBox::information(NULL, "单击了button", 
				"hello world", QMessageBox::Yes);
}


o@o-pc:~/MyStudy/Watermark$ cat main.cpp 
#include "hello.h"
#include <QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	hello w;
	w.show();

	return a.exec();
}

##2.编写.pro文件 ***.pro是Qt的工程文件,这个文件是给qmake用来生成Makefile用的。 如果了解makefile的人应该知道,Makefile的三个关键点就是目标依赖命令。这里也很类似。 .pro文件中可以指明这个Qt项目的头文件源文件链接的外部库目标文件名模板(生成什么样的Makefile)版本配置(debug/release)等。 这里并不打算详细介绍每一个部分,只做简单介绍

.pro中变量含义示例
TEMPLATE模板变量指定生成makefile(app:应用程序/lib:库)TEMPLATE = app
QT使用到的Qt定义的类(core/gui/widgets...)QT += widgtes
DESTDIR指定生成的应用程序放置的目录DESTDIR += ../bin
TARGET指定生成的应用程序名TARGET = hello
HEADERS工程中包含的头文件HEADERS += hello.h
FORMS工程中包含的.ui设计文件FORMS += hello.ui
SOURCES工程中包含的源文件SOURCES += main.cpp hello.cpp
RESOURCES工程中包含的资源文件RESOURCES += qrc/hello.qrc
LIBS引入的lib文件的路径 -L:引入路径LIBS += -L.
---
CONFIG用来告诉qmake关于应用程序的配置信息CONFIG+= qt warn_on release
UI_DIR指定.ui文件转化成ui_*.h文件的存放目录UI_DIR += forms
RCC_DIR指定将.qrc文件转换成qrc_*.h文件的存放目录RCC_DIR += ../tmp
MOC_DIR指定将含Q_OBJECT的头文件转换成标准.h文件的存放目录MOC_DIR += ../tmp
OBJECTS_DIR指定目标文件(obj)的存放目录OBJECTS_DIR += ../tmp
DEPENDPATH程序编译时依赖的相关路径DEPENDPATH += . forms include qrc sources
INCLUDEPATH头文件包含路径INCLUDEPATH += .

-还有,这个.pro文件中,以#开头的是注释

具体可以看这篇文章: QT中PRO文件写法的详细介绍

###hello.pro 因为我们这里比较简单,就只写需要的部分了。

# 使用到的Qt库
QT       += core widgets

#目标文件名
TARGET = hello

#生成应用程序
TEMPLATE = app

#用到的cpp源文件
SOURCES += main.cpp hello.cpp

#用到的cpp头文件
HEADERS  += hello.h

##3. 使用qmake生成Makefile文件 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.使用qmake作为Qt库和Qt所提供的工具的主要连编工具。

qmake程序在Qt的安装目录下,比如我的机器上就在 o@o-pc:~/program_files/Qt5.4.1/5.4/gcc_64/bin$ 你可以把这个路径加入到系统环境变量的PATH变量中,这样就可以随便使用了。我不喜欢加入到环境变量,所以这里指定路径来运行。

如果没有安装Qt qmake,可以使用apt-get来获取(大便系的linux)

o@o-pc:~/MyStudy$ sudo apt-get install qt5-qmake 

如果你加了,使用下面的命令来生成Makefile文件

qmake hello.pro -o Makefile

其实这样也可以(qtchooser在/usr/bin目录下,这里的qt是安装到默认目录的)

o@o-pc:~/hello$ qtchooser  -run-tool=qmake  -qt=5 hello.pro 

我这里是这样的

o@o-pc:~/program_files/Qt5.4.1/5.4/gcc_64/bin$ ./qmake ~/hello/hello.pro -o ~/hello/Makefile

###编译hello程序 生成了makefile之后,使用make命令来编译就可以了。 可以看到我这里出了一点问题,报了一堆错误。是因为没有链接xcb这个库。这是在我安装了xcb库之后依然存在的错误,最开始是找不到libGL这个问题。解决的办法就是修改.pro文件。这个见后面

o@o-pc:~/hello$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o main.o main.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o widget.o widget.cpp
/usr/lib/x86_64-linux-gnu/qt5/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -I/usr/include/c++/4.8 -I/usr/include/x86_64-linux-gnu/c++/4.8 -I/usr/include/c++/4.8/backward -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include widget.h -o moc_widget.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o moc_widget.o moc_widget.cpp
g++ -m64 -Wl,-O1 -o hello main.o widget.o moc_widget.o   -L/usr/X11R6/lib64 -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread 
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_poll_for_special_event’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_wait_for_special_event’未定义的引用
//usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0:对‘xcb_get_reply_fds’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_unregister_for_special_event’未定义的引用
/usr/lib/x86_64-linux-gnu/libGL.so:对‘xcb_register_for_special_xge’未定义的引用
//usr/lib/x86_64-linux-gnu/libxcb-dri3.so.0:对‘xcb_send_fd’未定义的引用
collect2: error: ld returned 1 exit status
make: *** [hello] 错误 1

###解决 xcb_xxx未定义的引用的问题 这里出现的都是xcb_xxx...未定义的引用的问题,说明在链接的时候没有链接到libxcb库。很好解决,修改pro文件中的LIBS变量就是。

# 使用到的Qt库
QT       += core widgets

#目标文件名
TARGET = hello

#生成应用程序
TEMPLATE = app

#用到的cpp源文件
SOURCES += main.cpp hello.cpp

#用到的cpp头文件
HEADERS  += hello.h

#解决 xcb_xxx未定义引用问题
LIBS += -lxcb

###未出错的编译 下面可以直接使用qmake是因为我安装了qt5-qmake(sudo apt-get install qt5-qmake)

o@o-pc:~/hello$ ls
hello.cpp  hello.h  hello.pro  hello.pro.user  main.cpp
o@o-pc:~/hello$ qmake 
o@o-pc:~/hello$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o main.o main.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o hello.o hello.cpp
/usr/lib/x86_64-linux-gnu/qt5/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -I/usr/include/c++/4.8 -I/usr/include/x86_64-linux-gnu/c++/4.8 -I/usr/include/c++/4.8/backward -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include hello.h -o moc_hello.cpp
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I. -o moc_hello.o moc_hello.cpp
g++ -m64 -Wl,-O1 -o hello main.o hello.o moc_hello.o   -L/usr/X11R6/lib64 -lxcb -lQt5Widgets -L/usr/lib/x86_64-linux-gnu -lQt5Gui -lQt5Core -lGL -lpthread 
o@o-pc:~/hello$ 

###下面来看一下运行效果 hello运行

</font>

© 著作权归作者所有

共有 人打赏支持
乌合之众
粉丝 13
博文 90
码字总数 79369
作品 2
海淀
程序员
私信 提问
解决qt-creator提示没有有效的Qt版本问题

qt-creator是一个很好的c/c++开发工具,使用该工具查看源码十分方便。但是又是出现问题也让人头疼万分…… 在qt-creator中创建新项目时,提示如下错误: 出现该问题的原因是没有找到相应的q...

鉴客
2012/07/11
4.2K
0
Nokia Qt SDK的开发环境的搭建

Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。QT完全面向对象的,很容易扩展,并且允许正确的组建编程。 Qt软件开发工具包...

chenboqiang
2010/05/03
0
0
Qt/Embedded for Linux 应用开发案例

一、开发环境的构建 1.下载Qt源代码,包括桌面版和嵌入式版 如4.7.4版:qt-everywhere-opensource-src-4.7.4.tar.gz qt-everywhere-opensource-src-4.7.4[embedded].tar.gz 解压缩到当前目录...

水海云
2012/04/21
0
0
Qt使用教程之添加Qt版本

<Qt Enterprise最新版下载> Qt Creator允许你在开发的PC上安装多个版本的Qt,并且可以使用不同的版本来构建项目。例如,设备制造商可能会为他们的设备提供特殊的Qt版本来开发应用程序。 Qt C...

Miss_Hello_World
2015/12/02
29
0
Qt使用教程之指定生成设置(二)

<Qt Enterprise最新版下载> 在指定生成设置(一)一文中,我们为大家介绍了编辑生成配置、启动外部进程、使用环境变量以及使用Qt Creator变量等内容。在本文中我们将继续为大家介绍如何生成步...

Miss_Hello_World
2015/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue重要知识小结

vue sync修饰 (1)双向数据绑定,父子组件之间信息的交互 1⃣️在自组件中使用this.emmit('toFather'),子组件产生一个tofather事件,然后在父组件中通过@进行监听,那么可以实现通信过程 2⃣...

peakedness丶
39分钟前
1
0
1024我们的码农节-向自己致敬!

一、blog主有话要说 作为(真正)入赘程序届的第一年, 对明天的1024码农节有很多话想说.比如: 给各位辛苦大佬们讲几个咱们程序届段子 给自己立一个flag, 明年的1024争取少掉点甚至不掉头发! ...

Ala6
42分钟前
10
0
solr使用规范

0. 目的 规范solr设计、用法,避免bug,提高性能 1. 设计规范 solr的用途是查询,不是存储,建议查询结果尽量都为id主键,而后再拿该id主键到缓存或者db中再查询相关信息,例如:请勿将经销商...

andersChow
54分钟前
1
0
11-《深度拆解JVM》之Java对象的内存布局

一、问题引入 在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对...

飞鱼说编程
58分钟前
1
0
Windows Install Docker

win7、win8 win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ docker toolbox...

linuxprobe16
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部