- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个包含多个插件的 c++/Qt 程序。对于每个类,我必须定义一个如下所示的插件接口(interface):
//my class
class qwerty;
//my interface
class qwertyPlug : public QObject, myPlug {
Q_OBJECT
Q_INTERFACES(nPanPlug)
Q_PLUGIN_METADATA(IID "org.myapp.plug")
public:
qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");}
QByteArray name() {return "qwerty";}
};
我创建了一个宏(实际上是 2 个,因为我不是 C++ 预处理器专家):
#define MY_PLUGIN_BASE(__c_name,__appendix) \
class __c_name##__appendix : public QObject, myPlug { \
Q_OBJECT \
Q_INTERFACES(nPanPlug) \
Q_PLUGIN_METADATA(IID "org.myapp.plug") \
public: \
__c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} \
QByteArray name() {return #__c_name;} \
};
#define MY_PLUGIN(__c_name) MY_PLUGIN_BASE(__c_name,Plug)
所以在我的代码中(定义了 qwerty
)我只需要添加:
MY_PLUGIN(qwerty)
这将展开(g++ -E
的输出):
class qwertyPlug : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} QByteArray name() {return "qwerty";} };
它看起来还不错(对于可读性很抱歉,但我不知道如何添加换行符..)并且如果在我的代码中复制/粘贴上面的行但是......
当我编译我的项目时,我从 moc
中得到错误:
Error: Class declaration lacks Q_OBJECT macro.
有人有想法吗?
最佳答案
事实证明,正如@Silicomancer 所建议的那样,你不能像现在这样。
我发现问题出在多行宏上,如果宏是单行的,它确实有效:
#define MY_PLUGIN_BASE(__c_name,__appendix) class __c_name##__appendix : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} QByteArray name() {return #__c_name;} };
对我来说,看起来 moc 遍历文件寻找 Q_OBJECT
但不会混淆宏
关于包含 Q_OBJECT 的 c++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056941/
在Qt中,我们知道Q_OBJECT是一个宏。在这种情况下,宏意味着什么?特别是我发现术语“宏”可能有几种不同的定义。 谢谢。 最佳答案 宏仅仅意味着Q_OBJECT实际上是一个C++宏。它在 src/
这个类没问题: #include class LiveImageItem : public QThread { Q_OBJECT public: LiveImageItem(QPix
我收到的错误: g++ -c -g -I/usr/lib/qt-3.3/include TCPEchoServer.cpp Product.h:22: error: ISO C++ forbids d
我在构建应用程序时收到以下链接器错误。 HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaO
文档指出: The Q_OBJECT macro must appear in the private section of a class definition that declares its
有个类似的问题here正在寻找解决方法和不错的指南 here它描述了 Qt 中的元对象系统。但这并没有直接解释为什么不能在元对象系统中使用模板类。这是一个令人讨厌的限制。 有人知道为什么吗? 最佳答案
有个类似的问题here正在寻找解决方法和不错的指南 here它描述了 Qt 中的元对象系统。但这并没有直接解释为什么不能在元对象系统中使用模板类。这是一个令人讨厌的限制。 有人知道为什么吗? 最佳答案
众所周知,Q_OBJECT 是实例,不可复制。 是否有任何一种语法糖可以复制任意 QObject 派生类的所有静态和动态属性? 这看起来很简单,但我找不到任何引用 - 显然自己实现一个应该很简单 -
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
当我在 Qt Creator 中创建一个新的 Q_OBJECT 类时,它会创建这个默认构造函数。我想添加另一个参数以便我可以传递用户输入,但我不确定如何执行此操作,因为 QObject 是第一个参数并
这是我的代码: 工具.h #include namespace Tinject { class ProbeCreator : public QObject {
我编写了一个扩展 QWidget 类的自定义 Qt 小部件。 让我们考虑以下代码: .h #ifndef SS_TEST_H #define SS_TEST_H #include class Tes
为什么我们通常只在私有(private)部分给出 Q_OBJECT? 我尝试了一个示例程序,在公共(public)部分给出它,我发现没有区别。 如果有人知道,你能告诉我原因吗。 最佳答案 默认情况下,
我有一个不使用 qmake 的遗留版本,但我想添加 QUdpSocket 并将其与信号和插槽连接。我有一个使用 Q_OBJECT 的类。如果我希望信号和槽可用但我没有使用 qmake,我需要做什么才能
我正在开发一个包含多个插件的 c++/Qt 程序。对于每个类,我必须定义一个如下所示的插件接口(interface): //my class class qwerty; //my interface
我有一个由 QFutureWatcher 触发的插槽。我正在尝试转换发件人以获得结果 QFutureWatcher>* QFW = qobject_cast>*>(sender()); 但不断得到 e
如何通过元编程制作基于 Q_OBJECT 的类(具有信号和/或槽的类)?我不在乎它是模板还是预处理器,两者似乎都不起作用,但我确实也需要它。 我想要的是能够将任意函数绑定(bind)到 Qt 信号。
我在一个项目中工作,其中在我需要继承的类中使用了 Q_OBJECT 宏。 已经定义了 Q_OBJECT 的类如下所示, class cBaseObject : public QObject, publ
我在 OSX Lion 中运行 QtCreator,每当我创建一个需要 Q_OBJECT 宏的类时,我都会在尝试构建我的应用程序时遇到错误。该类的代码如下,我收到的错误也是如此。有什么线索吗? 注意:
问题 自从从 Qt 5.10 升级到 Qt 5.11 后,我开始无法生成带有 QDoc 的文档。对于我现有的项目。 许多问题之一是文档中缺少函数,尽管源代码中存在相应的注释。 研究 我已设法将问题缩小
我是一名优秀的程序员,十分优秀!