VC++ 6.0下Qt的编写和编译

为了使用信号和槽机制,我们将自定义类继承自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 <qapplication.h>
#include <qwidget.h>

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 <qobject.h>

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 <qmessagebox.h>

void AClass::theSlot()
{
QMessageBox::information(0,"AClass","AClass::theSlot()!");
emit theSignal();
}


void BClass::theSlot()
{
QMessageBox::information(0,"BClass","BClass::theSlot()!");
}

3、把qt3exampl.cpp文件修改如下:

#include <qapplication.h>
#include <qwidget.h>
#include <qpushbutton.h>

#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。

 

 

 

 

qt中的 .ui文件要转化为 .cpp和 .h

可以通过以下命令:(以一个名为hello.ui的文件为例)

uic -o hello.h hello.ui

uic -o hello.cpp -impl hello.h hello.ui

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值