VC++6.0中自定义Qt类的编写和编译

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。

 

你可能感兴趣的:(Qt)