Qt:在#ifndef指令中包装Q_OBJECT声明

时间:2018-01-12 19:04:44

标签: qt signals-slots preprocessor-directive

我认为

#ifndef SERVER
    Q_OBJECT
#endif

导致

  

注意:未找到相关课程。没有输出。

来自我的编译器。可能是因为Qt预处理器正在查找的Q_OBJECT不受C预处理器指令的影响(或没有受到其影响)。处理这个问题的正确方法是什么?

我这样做是因为我不需要服务器上的信号插槽爵士乐,所以为了提高效率,我取消了声明。

我在Ubuntu 64位上运行Qt 4.8在GNU中构建。

2 个答案:

答案 0 :(得分:1)

根据我的理解,服务器和客户端编译在同一个顶级项目中完成,可能会共存。如果你希望客户端使用Q_OBJECT宏而服务器没有,那么这个代码是C ++多态实现这样的要求,同时具有相同的类名(top_server):

此处所有实例(服务器,客户端等)都是从top_Server实例化的。

重要的是,当客户端类实现Q_OBJECT宏时,服务器类永远不会调用Q_OBJECT宏。

顶级抽象类代码:

abstract_class.h

#ifndef ABSTRACT_CLASS_H
#define ABSTRACT_CLASS_H
#include <QString>
class top_Server // Abstract Class
{
public:
    virtual bool method1 (QString,QString) =0;
};
#endif // ABSTRACT_CLASS_H

然后SERVER派生类声明

server.h

#ifndef SERVER_H
#define SERVER_H
#include "abstract_class.h"
#include <QObject>

class Server: public top_Server
{

public:
    explicit Server (QString ,QString, QObject *parent = nullptr);
    bool method1 (QString,QString);
};
#endif // SERVER_H

然后客户端派生类声明

client.h

#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include "abstract_class.h"
class client: public QObject, public top_Server // Client class inherits Abstract class and runs the Q_OBJECT macro
{
    Q_OBJECT

public:
    explicit client(QString ,QString, QObject *parent = nullptr);
    bool method1 (QString,QString);
};
#endif // CLIENT_H

然后是.CPP文件中的类代码

client::client(QString DB_user, QString DB_pwd, QObject *parent) : QObject(parent)
{

}
bool client::method1(QString str1, QString str2)
{

}

Server::Server (QString str1 ,QString str2 , QObject *parent)
{

}
bool Server::method1(QString str1, QString str2)
{

}

现在隐藏服务器和客户端的实现,并且可以使用相同的类名实例化任何实现,也可以从一个对象切换到另一个对象:

 top_Server *common_object_name;

然后可以使用某个客户端:

common_object_name = new client;

.... 以及其他地方的服务器

common_object_name = new server;

成本是知道有两个隐藏类,而优势显而易见!

答案 1 :(得分:0)

(对不起,我还没有评论,所以我回答。)

如果可能的话,我会建议@Mohammad Kanan的方式。

否则,Qt的moc在解析代码时会定义Q_MOC_RUN。这样,使用#ifndef Q_MOC_RUN [...] #endif,您可以完全排除代码部分被moc处理。 (参考:https://doc.qt.io/archives/qt-4.8/moc.html#command-line-options