首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt:用#ifndef指令包装Q_OBJECT声明

Qt:用#ifndef指令包装Q_OBJECT声明
EN

Stack Overflow用户
提问于 2018-01-12 19:04:43
回答 2查看 373关注 0票数 1

我认为

代码语言:javascript
复制
#ifndef SERVER
    Q_OBJECT
#endif

正导致

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

从我的编译器那里。可能是因为无论Qt预处理器正在寻找什么,Q_OBJECT都不会受到C预处理器指令的影响(或者没有受到适当的影响)。处理这件事的正确方法是什么?

我这样做是因为我不需要服务器上的信号槽爵士乐,所以为了效率起见,我删除了这个声明。

我在Ubuntu 64位的GNU上运行QT4.8大楼。

EN

回答 2

Stack Overflow用户

发布于 2018-01-12 23:23:24

据我所知,服务器和客户端编译是在同一个顶级项目中完成的,可能会共存。如果您希望客户端在服务器不使用时使用Q_OBJECT宏,那么这段代码是C++多态实现这类需求,同时两者的类名相同(top_server):

这里是所有实例(服务器、客户端...etc)。是从top_Server实例化的。

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

顶级抽象类代码:

abstract_class.h

代码语言:javascript
复制
#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.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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文件中使用类代码

代码语言:javascript
复制
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)
{

}

现在服务器和客户端的实现是隐藏的,可以使用相同的类名来实例化任意类,您还可以从一个对象切换到另一个对象:

代码语言:javascript
复制
 top_Server *common_object_name;

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

代码语言:javascript
复制
common_object_name = new client;

……在其他地方,一个服务器

代码语言:javascript
复制
common_object_name = new server;

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

票数 1
EN

Stack Overflow用户

发布于 2018-01-31 11:39:25

(对不起,我还不能发表评论,所以我回答。)

我建议@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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48232548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档