Private QObject API: Difference between revisions
No edit summary |
No edit summary |
||
Line 30: | Line 30: | ||
== Q_PRIVATE_SLOT == | == Q_PRIVATE_SLOT == | ||
Similar to Q_PRIVATE_PROPERTY, Q_PRIVATE_SLOT is used when you have a slot in a private class that you want to be considered part of the API of the corresponding public class. Using QQuickItem as an example again, Q_PRIVATE_SLOT is used to declare this private slot in [http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitem.h?id=b1243b8c9ea0add1b7548428c8b0fcb8ee3ac71a#n455 qquickitem.h]: | Similar to Q_PRIVATE_PROPERTY, Q_PRIVATE_SLOT is used when you have a slot in a private class that you want to be considered part of the API of the corresponding public class, without affecting the interface (and hence binary compatibility) of that public class. Using QQuickItem as an example again, Q_PRIVATE_SLOT is used to declare this private slot in [http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitem.h?id=b1243b8c9ea0add1b7548428c8b0fcb8ee3ac71a#n455 qquickitem.h]: | ||
private: | private: |
Revision as of 14:07, 15 March 2018
There are certain QObject macros and conventions that are for use in private Qt APIs only. This page describes them.
Q_PRIVATE_PROPERTY
Introduced here.
This macro is used when you have a C++ class that is public that exposes a property whose type is not public. For example, QQuickItem is a public C++ class that exposes an anchors property, whose type is the private QQuickAnchors class:
Q_PRIVATE_PROPERTY(QQuickItem::d_func(), QQuickAnchors * anchors READ anchors DESIGNABLE false CONSTANT FINAL)
In this case, the macro expects there to be a getter named anchors() in the type returned by QQuickItem::d_func(), which there is:
QQuickAnchors *anchors() const;
When using this macro, it's necessary to include the generated moc file at the end of the corresponding .cpp file:
QT_END_NAMESPACE // ... #include "moc_qquickitem_p.cpp"
If you don't do this, you may see an error like the following (example taken from another class -- replace popup with item and it's the same error):
[...] moc_qquickpopup_p.cpp .moc\debug\moc_qquickpopup_p.cpp(1069): error C2027: use of undefined type 'QQuickPopupPrivate' c:\dev\qt5-dev-d\qtquickcontrols2\src\quicktemplates2\.moc\debug\../../../../../../qt5-dev/qtquickcontrols2/src/quicktemplates2/qquickpopup_p.h(71): note: see declaration of 'QQuickPopupPrivate' .moc\debug\moc_qquickpopup_p.cpp(1069): error C2227: left of '->anchors' must point to class/struct/union/generic type
Q_PRIVATE_SLOT
Similar to Q_PRIVATE_PROPERTY, Q_PRIVATE_SLOT is used when you have a slot in a private class that you want to be considered part of the API of the corresponding public class, without affecting the interface (and hence binary compatibility) of that public class. Using QQuickItem as an example again, Q_PRIVATE_SLOT is used to declare this private slot in qquickitem.h:
private: Q_PRIVATE_SLOT(d_func(), void _q_resourceObjectDeleted(QObject *))
The slot itself is declared in qquickitem_p.h:
void _q_resourceObjectDeleted(QObject *);