在我的项目中,我需要使用宏创建QObject派生类(带有Q_OBJECT和信号)。宏位于单独的文件中。这是一个简化的示例:
该宏在文件CreateQtClass.h中声明:
for job <"A" "C" "E"> workers : {"Albert" "Bob"}
for job <"A" "C" "F"> workers : {"Charles"}
我使用宏在MyQtClass.h文件中创建我的类
#ifndef __CREATEQTCLASS_H__
#define __CREATEQTCLASS_H__
#define CREATE_QT_CLASS( ClassName ) \
class ClassName : public QObject \
{ \
Q_OBJECT \
\
signals: \
Q_SIGNAL void mySignal( void ); \
};
#endif //__CREATEQTCLASS_H__
在我的.qbs文件中,将MyQtClass.h添加到files属性,如下所示:
#ifndef __MYQTCLASS_H__
#define __MYQTCLASS_H__
#include <QObject>
#include "CreateQtClass.h"
CREATE_QT_CLASS( MyQtClass );
#endif //__MYQTCLASS_H__
现在,当运行import qbs
QtApplication {
name: "HelloWorld-Qt"
files: [ "main.cpp", "MyQtClass.h" ]
}
时,qbs不会在MyQtClass.h上运行'moc'。看来它没有正确执行扫描,也没有检测到宏内的Q_OBJECT。
(我可能会注意到,如果宏声明和用法位于同一文件中,则一切正常。)
用户是否可以手动强制qbs在文件上运行'moc'?
也许我们需要像“ force_moc” fileTag(与“ unmocable”相反)之类的东西,我可以将其应用于包含MyQtClass.h的组。
我正在添加一个简单的Makefile和main.cpp来演示moc与上述方法一起使用的效果很好:
文件main.cpp:
qbs build
Makefile:
#include <QDebug>
#include "MyQtClass.h"
static void mySlot( void )
{
qDebug() << "Hello slot";
}
int main( void )
{
MyQtClass c;
QObject::connect( &c, &MyQtClass::mySignal, &mySlot );
emit c.mySignal();
return 0;
}
答案 0 :(得分:0)
我认为,无论您使用哪种构建工具,您的方法都行不通。请记住,moc寻找Q_OBJECT宏。在MyQtClass.h中找不到这样的宏,因为moc和支持它的构建工具都不会扩展CREATE_QT_CLASS宏,因为宏扩展也会扩展Q_OBJECT。 请注意,如果将CreateQtClass.h添加到您的qbs文件中,您会注意到qbs确实在moc上运行-但在CreateQtClass文件上。这是正确的行为,因为这就是Q_OBJECT宏所在的位置。 我对qmake和cmake进行了仔细检查,它们的行为均相同:如果未在项目文件中列出CreateQtClass,它们将不会运行。如果您列出了它,则moc将在该文件上运行。 如果您想继续使用宏,则必须确保在调用站点上引用Q_OBJECT,例如作为宏参数。但是即使那样,我仍然不确定moc本身是否会喜欢这种结构。