VC++6.0中自定义Qt类的编写和编译
原来的标题为“VC++6.0中基于Qt元对象编译器的类的编写和编译”,感觉不妥,现改为“VC++6.0中自定义Qt类的编写和编译”。
(C)ShiShengSoft原创文章,转载请注明出处:http://blog.csdn.net/shishengsoft/
为了使用信号和槽机制,我们将自定义类继承自QObject类,并正确书写了源代码,但通过VC++的IDE编译执行程序时,却总是出现连接错误。这其实是由于对Qt类的一些特性不了解所致。具体描述,大家可以查看C++ GUI Programming Qt3一书中的“Qt的元对象系统”的描述。
下面我们以在VC++6.0为例,介绍如何正确编写和编译自定义的Qt类。
一、配置Qt的环境变量和msvc编译器的环境变量
1、添加Qt的环境变量:
变量名:QMAKESPEC
变量值:win32-msvc
注意,win32-msvc为Qt安装目录下mkspecs目录中的一个同名目录
变量名:QTDIR
变量值:c:/qt-win-free-msvc-3.3.3
注意,指向你的机器中Qt的安装目录
变量名:path
变量值:%QTDIR%;%QTDIR%/bin;%QTDIR%/lib;
注意,将此变量值追加到path变量的值中,即指向Qt的安装目录及其下的Bin和Lib目录。
2、msvc编译器的环境变量
通常安装好VC++6.0后,环境变量就已经配置好。如果它的环境变量丢失,可以到VC的安装目录的Bin目录中,
执行VCVARS32.BAT批处理文件即可恢复。
最后说明一点,在Windows XP中,环境就是分为用户变量与系统变量两部分,
通常放在配置环境变量时,修改用户变量部分的环境变量即可生效,建议注册并重新登录为妥。
二、在命令行窗口中使用qmake创建VC项目文件
1、我们在C盘根目录下创建一个文件夹qt3example和一个.cpp文件qt3example.cpp。
2、从命令行窗口进入c:/qt3example目录下。
3、创建一个和平台无关的项目文件qt3example.pro,请输入:
qmake -project
4、根据项目文件qt3example.pro创建一个平台特定的Makefile,请输入:
qmake qt3example.pro
5、我们使用VC++来编辑源代码,所以再创建一个VC++的项目文件,请输入
qmake -tp vc qt3example.pro
6、启动VC++集成开发环境,打开qt3example.dsp,然后编写源代码,并将其保存。请输入:
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget *widget = new QWidget(0);
app.setMainWidget(widget);
widget->show();
return app.exec();
}
7、在命令行窗口中编译程序,请输入:
nmake
注意,会出现一些连接警告信息,不用管它就是了。警告信息内容可能如下:
...
LINK : warning LNK4199: /DELAYLOAD:comdlg32.dll ignored; no imports found from comdlg32.dll
...
8、运行程序,请输入:
qt3example
这时会弹出一个窗口,否则请检查是否遵循上述步骤。下面我们转入本文的重点。
三、编写基于QObject的Qt类
我们在上面的代码基础上,添加两个Qt类,并添加信号和槽。
1、新建一个myclass.h文件,再输入:
#ifndef _H_MYCLASS_H
#define _H_MYCLASS_H
#include
class AClass:public QObject
{
Q_OBJECT
public slots:
void theSlot();
signals:
void theSignal();
};
class BClass:public QObject
{
Q_OBJECT
public slots:
void theSlot();
};
#endif
2、新建一个myclass.cpp文件,再输入:
#include "myclass.h"
#include
void AClass::theSlot()
{
QMessageBox::information(0,"AClass","AClass::theSlot()!");
emit theSignal();
}
void BClass::theSlot()
{
QMessageBox::information(0,"BClass","BClass::theSlot()!");
}
3、把qt3exampl.cpp文件修改如下:
#include
#include
#include
#include "myclass.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
QWidget *widget = new QWidget(0);
QPushButton *button = new QPushButton(widget);
button->setText("Press Me");
AClass *a = new AClass;
BClass *b = new BClass;
QObject::connect(button, SIGNAL(clicked()), a, SLOT(theSlot()));
QObject::connect(a, SIGNAL(theSignal()), b, SLOT(theSlot()));
app.setMainWidget(widget);
widget->show();
return app.exec();
}
4、在命令行中编译程序,请输入:
nmake
特别要注意,如果你通过VC++的IDE来编译执行程序,则会出现类似如下的连接错误:
...
qt3exampl.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall AClass::qt_property(int,int,class QVariant *)" (?qt_property@AClass@@UAE_NHHPAVQVariant@@@Z)
...
这是因为Qt扩展了C++语言,加了入slots、signals、emit等关键字,如果直接将源代码交给msvc编译器处理,则会出错。
解决办法是,在命令行窗口中使用nmake命令来编译源代码,这样Qt就能够先使用moc(元对象编译器 meta-object compiler)对
源代码处理后,再由msvc编译器处理,这样就能正确编译连接。
5、运行程序,请输入:
qt3example
到此,如果代码没有错误,则程序能够运行。
最后,对于Qt编程的一些总结如下:
1、为了在自定义类中使用信号和槽,应继承自QObject类。
2、在类定义的开始处加上Q_OBJECT宏,这是必需的。
3、在命令行窗口编译执行程序,而不是通过VC++的IDE。