QBS:通过另一个文件中的宏声明类时,qbs无法运行moc

时间:2018-11-07 08:15:45

标签: qt qbs

在我的项目中,我需要使用宏创建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;
}

1 个答案:

答案 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本身是否会喜欢这种结构。

相关问题