我认为
#ifndef SERVER
Q_OBJECT
#endif正导致
注:未找到相关课程。没有生成输出。
从我的编译器那里。可能是因为无论Qt预处理器正在寻找什么,Q_OBJECT都不会受到C预处理器指令的影响(或者没有受到适当的影响)。处理这件事的正确方法是什么?
我这样做是因为我不需要服务器上的信号槽爵士乐,所以为了效率起见,我删除了这个声明。
我在Ubuntu 64位的GNU上运行QT4.8大楼。
发布于 2018-01-12 23:23:24
据我所知,服务器和客户端编译是在同一个顶级项目中完成的,可能会共存。如果您希望客户端在服务器不使用时使用Q_OBJECT宏,那么这段代码是C++多态实现这类需求,同时两者的类名相同(top_server):
这里是所有实例(服务器、客户端...etc)。是从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.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;成本是知道有两个隐藏类,而优势是显而易见的!
发布于 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)
https://stackoverflow.com/questions/48232548
复制相似问题