Spec-Zone.ru › Qt 6.1

Класс QObject

Класс QObject является базовым классом всех объектов Qt. Подробнее...

Заголовок: #include <QObject>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Наследуется от:

Q3DObject, Q3DScene, Q3DTheme, QAbstract3DAxis, QAbstract3DInputHandler, QAbstract3DSeries, QAbstractAnimation, QAbstractAxis, QAbstractDataProxy, QAbstractEventDispatcher, QAbstractItemDelegate, QAbstractItemModel, QAbstractItemModelTester, QAbstractNetworkCache, QAbstractOAuth, QAbstractOAuthReplyHandler, QAbstractSeries, QAbstractState, QAbstractTextDocumentLayout, QAbstractTransition, QAccessiblePlugin, QAction, QActionGroup, QAxBaseObject, QAxFactory, QAxScript, QAxScriptManager, QBarSet, QBoxSet, QButtonGroup, QCandlestickModelMapper, QCandlestickSet, QClipboard, QCoapClient, QCompleter, QCoreApplication, QCustom3DItem, QDataWidgetMapper, QDBusAbstractAdaptor, QDBusAbstractInterface, QDBusPendingCallWatcher, QDBusServer, QDBusServiceWatcher, QDBusVirtualObject, QDesignerFormEditorInterface, QDesignerFormWindowManagerInterface, QDnsLookup, QDrag, QDtls, QDtlsClientVerifier, QEventLoop, QExtensionFactory, QExtensionManager, QFileSelector, QFileSystemWatcher, QFutureWatcher, QGenericPlugin, QGesture, QGraphicsAnchor, QGraphicsEffect, QGraphicsItemAnimation, QGraphicsObject, QGraphicsScene, QGraphicsTransform, QHelpEngineCore, QHelpFilterEngine, QHelpSearchEngine, QHttpMultiPart, QIconEnginePlugin, QImageIOPlugin, QInputDevice, QInputMethod, QIODevice, QItemSelectionModel, QJSEngine, QLayout, QLegendMarker, QLibrary, QLocalServer, QMimeData, QMovie, QMqttClient, QMqttSubscription, QNetworkAccessManager, QNetworkCookieJar, QNetworkInformation, QObjectCleanupHandler, QOffscreenSurface, QOpcUaClient, QOpcUaGdsClient, QOpcUaKeyPair, QOpcUaNode, QOpcUaProvider, QOpenGLContext, QOpenGLContextGroup, QOpenGLDebugLogger, QOpenGLShader, QOpenGLShaderProgram, QOpenGLTimeMonitor, QOpenGLTimerQuery, QOpenGLVertexArrayObject, QPdfWriter, QPieSlice, QPluginLoader, QQmlComponent, QQmlContext, QQmlEngineExtensionPlugin, QQmlExpression, QQmlFileSelector, QQmlImageProviderBase, QQmlPropertyMap, QQuick3DObject, QQuickColorGroup, QQuickImageResponse, QQuickItem, QQuickItemGrabResult, QQuickRenderControl, QQuickTextDocument, QQuickTextureFactory, QScreen, QScroller, QScxmlDataModel, QScxmlInvokableService, QScxmlInvokableServiceFactory, QScxmlStateMachine, QSessionManager, QSettings, QSGTexture, QSGTextureProvider, QSharedMemory, QShortcut, QSignalMapper, QSignalSpy, QSocketNotifier, QSqlDriver, QSqlDriverPlugin, QStyle, QStyleHints, QStylePlugin, QSvgRenderer, QSyntaxHighlighter, QSystemTrayIcon, Qt3DAnimation::QAbstractAnimation, Qt3DAnimation::QAnimationController, Qt3DAnimation::QAnimationGroup, Qt3DAnimation::QMorphTarget, Qt3DCore::QAbstractAspect, Qt3DCore::QAspectEngine, Qt3DCore::QNode, Qt3DCore::Quick::QQmlAspectEngine, Qt3DInput::QInputDeviceIntegration, Qt3DInput::QKeyEvent, Qt3DInput::QMouseEvent, Qt3DInput::QWheelEvent, Qt3DRender::QGraphicsApiFilter, Qt3DRender::QPickEvent, Qt3DRender::QRenderCapabilities, Qt3DRender::QRenderCaptureReply, Qt3DRender::QStencilOperationArguments, Qt3DRender::QStencilTestArguments, Qt3DRender::QTextureWrapMode, QTcpServer, QTextDocument, QTextObject, QThread, QThreadPool, QTimeLine, QTimer, QTranslator, QUiLoader, QUndoGroup, QUndoStack, QValidator, QValue3DAxisFormatter, QVirtualKeyboardAbstractInputMethod, QVirtualKeyboardExtensionPlugin, QVirtualKeyboardInputContext, QVirtualKeyboardInputEngine, QVirtualKeyboardObserver, QVirtualKeyboardTrace, QWaylandClient, QWaylandQuickShellIntegration, QWaylandSurfaceGrabber, QWaylandView, QWaylandXdgPopup, QWaylandXdgToplevel, QWidget, QWindow, и QWinEventNotifier

  • Список всех членов, включая наследуемые
  • Устаревшие члены

Примечание: Все функции в этом классе являются реентерабельными.

Примечание: Эти функции также являются безопасными для потоков:

  • connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
  • connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
  • connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
  • connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
  • connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
  • disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
  • disconnect(const char *signal, const QObject *receiver, const char *method) const
  • disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
  • deleteLater()

Свойства

  • objectName : QString

Открытые функции

QObject(QObject *parent = nullptr)
virtual ~QObject()
bool blockSignals(bool block)
const QObjectList & children() const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
bool disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
bool disconnect(const QObject *receiver, const char *method = nullptr) const
void dumpObjectInfo() const
void dumpObjectTree() const
QList<QByteArray> dynamicPropertyNames() const
virtual bool event(QEvent *e)
virtual bool eventFilter(QObject *watched, QEvent *event)
T findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
QList<T> findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
QList<T> findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
bool inherits(const char *className) const
void installEventFilter(QObject *filterObj)
bool isWidgetType() const
bool isWindowType() const
void killTimer(int id)
virtual const QMetaObject * metaObject() const
void moveToThread(QThread *targetThread)
QString objectName() const
QObject * parent() const
QVariant property(const char *name) const
void removeEventFilter(QObject *obj)
void setObjectName(const QString &name)
void setParent(QObject *parent)
bool setProperty(const char *name, const QVariant &value)
bool signalsBlocked() const
int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)
QThread * thread() const

Открытые слоты

void deleteLater()

Сигналы

void destroyed(QObject *obj = nullptr)
void objectNameChanged(const QString &objectName)

Статические открытые члены

QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
bool disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
bool disconnect(const QMetaObject::Connection &connection)
bool disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
const QMetaObject staticMetaObject
QString tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

Защищенные функции

виртуальный void childEvent(QChildEvent *event)
виртуальный void connectNotify(const QMetaMethod &signal)
виртуальный void customEvent(QEvent *event)
виртуальный void disconnectNotify(const QMetaMethod &signal)
bool isSignalConnected(const QMetaMethod &signal) const
int receivers(const char *signal) const
QObject * sender() const
int senderSignalIndex() const
виртуальный void timerEvent(QTimerEvent *event)

Связанные нечлены

QObjectList
T qobject_cast(QObject *object)
T qobject_cast(const QObject *object)

Макросы

QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
Q_CLASSINFO(Name, Value)
Q_DISABLE_COPY(Class)
Q_DISABLE_COPY_MOVE(Class)
Q_DISABLE_MOVE(Class)
Q_EMIT
Q_ENUM(...)
Q_ENUM_NS(...)
Q_FLAG(...)
Q_FLAG_NS(...)
Q_GADGET
Q_INTERFACES(...)
Q_INVOKABLE
Q_MOC_INCLUDE
Q_NAMESPACE
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
Q_OBJECT
Q_PROPERTY(...)
Q_REVISION
Q_SET_OBJECT_NAME(Object)
Q_SIGNAL
Q_SIGNALS
Q_SLOT
Q_SLOTS

Подробное описание

QObject — сердце Qt модели объектов. Центральной особенностью этой модели является очень мощный механизм бесшовного взаимодействия объектов, называемый сигналами и слотами. Вы можете подключить сигнал к слоту с помощью connect() и разорвать соединение с помощью disconnect(). Чтобы избежать бесконечных циклов уведомлений, вы можете временно заблокировать сигналы с помощью blockSignals(). Защищённые функции connectNotify() и disconnectNotify() позволяют отслеживать подключения.

QObject организуют себя в иерархии объектов. Когда вы создаёте QObject с другим объектом в качестве родителя, объект автоматически добавляет себя в список потомков родителя. Родитель берёт на себя ответственность за объект; то есть, он автоматически удалит своих потомков в своём деструкторе. Вы можете найти объект по имени и, по желанию, по типу, используя findChild() или findChildren().

Каждый объект имеет имя объекта, а его имя класса можно найти с помощью соответствующего metaObject() (см. QMetaObject::className()). Вы можете определить, наследуется ли класс объекта от другого класса в иерархии наследования QObject, используя функцию inherits().

Когда объект удаляется, он отправляет сигнал destroyed(). Вы можете перехватить этот сигнал, чтобы избежать висячих ссылок на QObjects.

QObject может получать события через event() и фильтровать события других объектов. Подробнее см. installEventFilter() и eventFilter(). Удобная обработчик childEvent() может быть переопределён для перехвата событий потомков.

И наконец, QObject предоставляет базовые средства работы с таймерами в Qt; для более продвинутого управления таймерами см. QTimer.

Обратите внимание, что макрос Q_OBJECT обязателен для любого объекта, реализующего сигналы, слоты или свойства. Вам также необходимо запустить компилятор метаобъектов на исходном файле. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject, независимо от того, используют ли они на самом деле сигналы, слоты и свойства, поскольку отказ от этого может привести к странному поведению некоторых функций.

Все Qt виджеты наследуют QObject. Удобная функция isWidgetType() возвращает значение true, если объект является виджетом. Она намного быстрее, чем qobject_cast<QWidget *>(obj) или obj->inherits("QWidget").

Некоторые функции QObject, например, children(), возвращают QObjectList. QObjectList — это псевдоним для QList<QObject *>.

Связанность с потоком

Объект QObject обладает привязанностью к потоку или располагается в определённом потоке. Когда QObject получает сигнал очереди или событие, размещённое в очереди, обработчик слота или события будет выполняться в потоке, в котором находится объект.

Примечание: Если у QObject нет привязанности к потоку (то есть, если thread() возвращает ноль), или если он находится в потоке, у которого нет работающего цикла событий, то он не может получить сигналы в очереди или размещённые в очереди события.

По умолчанию, QObject находится в том потоке, в котором он был создан. Привязанность объекта к потоку можно запросить с помощью thread() и изменить с помощью moveToThread().

Все QObjects должны находиться в том же потоке, что и их родитель. Следовательно:

  • setParent() завершится неудачей, если два QObjects находятся в разных потоках.
  • Когда QObject перемещается в другой поток, все его дочерние объекты также автоматически перемещаются.
  • moveToThread() завершится неудачей, если у QObject есть родитель.
  • Если QObjects созданы внутри QThread::run(), они не могут стать дочерними объектами объекта QThread, потому что QThread не существует в потоке, который вызывает QThread::run().

Примечание: Переменные членов QObject не автоматически становятся его дочерними элементами. Отношение родитель-потомок должно быть установлено, либо передав указатель на ребёнка в конструктор объекта, либо вызвав setParent(). Без этого шага переменные членов объекта останутся в старом потоке при вызове moveToThread().

Отсутствие копирующего конструктора или оператора присваивания

QObject не имеет ни конструктора копирования, ни оператора присваивания. Это сделано преднамеренно. На самом деле, они объявлены, но в разделе private с макросом Q_DISABLE_COPY(). На самом деле, все классы Qt, производные от QObject (прямо или косвенно), используют этот макрос для объявления конструктора копирования и оператора присваивания как закрытых. Обоснование можно найти в обсуждении Тождество против значения на странице модели объектов Qt Object Model.

Основным следствием является то, что вы должны использовать указатели на QObject (или на ваш подкласс QObject), где иначе вы могли бы быть искушены использовать ваш подкласс QObject как значение. Например, без конструктора копирования вы не можете использовать подкласс QObject в качестве значения, хранящегося в одном из контейнерных классов. Вы должны хранить указатели.

Автоподключение

Система метаобъектов Qt предоставляет механизм для автоматического подключения сигналов и слотов между подклассами QObject и их дочерними объектами. До тех пор, пока объекты определены с подходящими именами объектов, а слоты следуют простому соглашению об именовании, это подключение может быть выполнено во время выполнения функцией QMetaObject::connectSlotsByName().

uic генерирует код, который вызывает эту функцию, чтобы включить автоматическое подключение между виджетами на формах, созданных с помощью Qt Designer. Дополнительная информация об использовании автоматического подключения с Qt Designer приведена в разделе Использование файла UI Designer в вашем приложении руководства Qt Designer.

Динамические свойства

Начиная с Qt 4.2, динамические свойства могут быть добавлены к и удалены из экземпляров QObject во время выполнения. Динамические свойства не нуждаются в объявлении во время компиляции, но они обеспечивают те же преимущества, что и статические свойства, и управляются тем же API — с помощью property() для чтения и setProperty() для записи.

Начиная с Qt 4.3, динамические свойства поддерживаются Qt Designer, и стандартные виджеты Qt и созданные пользователем формы могут иметь динамические свойства.

Международная локализация (I18n)

Все подклассы QObject поддерживают функции локализации Qt, что позволяет перевести пользовательский интерфейс приложения на разные языки.

Чтобы сделать текст, видимый пользователю, переводимым, его необходимо заключить в вызовы функции tr(). Это подробно описано в документе Написание исходного кода для перевода.

См. также QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY() и Деревья объектов и владение.

Документация по свойствам

objectName : QString

Это свойство содержит имя этого объекта

Вы можете найти объект по имени (и типу) с помощью findChild(). Вы можете найти набор объектов с помощью findChildren().

qDebug("MyClass::setPrecision(): (%s) invalid precision %f",
       qPrintable(objectName()), newPrecision);

По умолчанию это свойство содержит пустую строку.

Функции доступа:

QString objectName() const
void setObjectName(const QString &name)

Сигнал уведомления:

void objectNameChanged(const QString &objectName) [см. примечание ниже]

Примечание: Это частный сигнал. Он может использоваться в подключениях сигналов, но не может быть испущен пользователем.

См. также metaObject() и QMetaObject::className().

Документация по членам-функциям

[invokable] QObject::QObject(QObject *parent = nullptr)

Конструирует объект с родительским объектом parent.

Родитель объекта можно рассматривать как владельца объекта. Например, диалоговое окно dialog box является родителем кнопок OK и Cancel, которые оно содержит.

Деструктор родительского объекта уничтожает все дочерние объекты.

Установка parent в nullptr создаёт объект без родителя. Если объект является виджетом, он станет главным окном.

Примечание: Эта функция может вызываться через систему метаобъектов и из QML. См. Q_INVOKABLE.

См. также parent(), findChild() и findChildren().

[slot] void QObject::deleteLater()

Планирует удаление этого объекта.

Объект будет удален, когда управление вернётся в цикл событий. Если цикл событий не работает, когда вызывается эта функция (например, deleteLater() вызывается на объекте до QCoreApplication::exec()), объект будет удалён после запуска цикла событий. Если deleteLater() вызывается после остановки основного цикла событий, объект не будет удалён. Начиная с Qt 4.8, если deleteLater() вызывается на объекте, который существует в потоке без работающего цикла событий, объект будет уничтожен, когда поток завершится.

Обратите внимание, что вход и выход из нового цикла событий (например, путём открытия модального диалога) не выполнят отложенное удаление; для удаления объекта необходимо, чтобы управление вернулось в цикл событий, из которого был вызван deleteLater(). Это не относится к объектам, удалённым, пока предыдущий, вложенный цикл событий ещё работал: цикл событий Qt удалит эти объекты, как только начнётся новый вложенный цикл событий.

Примечание: Безопасно вызывать эту функцию более одного раза; когда первый событие отложенного удаления доставляется, любые ожидающие события для объекта удаляются из очереди событий.

Примечание: Эта функция безопасна для потоков.

См. также destroyed() и QPointer.

[signal] void QObject::destroyed(QObject *obj = nullptr)

Этот сигнал излучается непосредственно перед уничтожением объекта obj после того, как все экземпляры QPointer были уведомлены и не может быть заблокирован.

Все дочерние объекты уничтожаются непосредственно после того, как этот сигнал излучается.

См. также deleteLater() и QPointer.

[private signal] void QObject::objectNameChanged(const QString &objectName)

Этот сигнал излучается после изменения имени объекта. Новое имя объекта передаётся как objectName.

Примечание: Это частный сигнал. Он может использоваться в подключениях сигналов, но не может быть испущен пользователем.

Примечание: Сигнал уведомления для свойства objectName.

См. также QObject::objectName.

[virtual] QObject::~QObject()

Уничтожает объект, удаляя все его дочерние объекты.

Все сигналы объекта и к объекту автоматически отключаются, а все ожидающие размещённые события для объекта удаляются из очереди событий. Однако часто безопаснее использовать deleteLater(), а не удалять подкласс QObject напрямую.

Предупреждение: Все дочерние объекты удаляются. Если хоть один из этих объектов находится на стеке или является глобальным, рано или поздно ваша программа выйдет из строя. Не рекомендуется хранить указатели на дочерние объекты извне родительского. Если вы всё же делаете это, сигнал destroyed() даёт вам возможность обнаружить, когда объект уничтожается.

Предупреждение: Удаление QObject во время ожидания событий может привести к сбою. Не удаляйте QObject напрямую, если он существует в другом потоке, чем тот, который выполняется в настоящее время. Используйте deleteLater() вместо этого, что заставит цикл событий удалить объект после обработки всех ожидающих событий.

См. также deleteLater().

bool QObject::blockSignals(bool block)

Если block равно true, сигналы, излучаемые этим объектом, блокируются (т.е., излучение сигнала не вызовет ничего, подключённого к нему). Если block равно false, блокировка не будет происходить.

Возвращаемое значение — предыдущее значение signalsBlocked().

Обратите внимание, что сигнал destroyed() будет излучен, даже если сигналы для этого объекта были заблокированы.

Сигналы, излученные во время блокировки, не буферизуются.

См. также signalsBlocked() и QSignalBlocker.

[virtual protected] void QObject::childEvent(QChildEvent *event)

Этот обработчик событий может быть переопределён в подклассе для получения событий дочерних объектов. Событие передаётся в параметре event.

События QEvent::ChildAdded и QEvent::ChildRemoved отправляются объектам при добавлении или удалении дочерних элементов. В обоих случаях вы можете положиться только на то, что дочерний элемент является QObject, или, если isWidgetType() возвращает true, QWidget. (Это потому, что в случае ChildAdded дочерний элемент ещё не полностью сконструирован, а в случае ChildRemoved он, возможно, уже был уничтожен).

События QEvent::ChildPolished отправляются виджетам, когда дочерние элементы отполированы или добавлены отполированные дочерние элементы. Если вы получаете событие отполирования дочернего элемента, конструктор дочернего элемента обычно завершён. Однако это не гарантируется, и несколько событий отполирования могут быть доставлены во время выполнения конструктора виджета.

Для каждого дочернего виджета вы получаете одно событие ChildAdded, ноль или более событий ChildPolished и одно событие ChildRemoved.

Событие ChildPolished пропускается, если дочерний элемент удаляется сразу после добавления. Если дочерний элемент обрабатывается несколько раз во время создания и уничтожения, вы можете получить несколько событий child polished для одного и того же дочернего элемента, каждый раз с различной виртуальной таблицей.

См. также event().

const QObjectList &QObject::children() const

Возвращает список дочерних объектов. Класс QObjectList определен в файле заголовков <QObject> следующим образом:

typedef QList<QObject*> QObjectList;

Первый добавленный дочерний элемент — это первый объект в списке, а последний добавленный дочерний элемент — последний объект в списке, то есть новые дочерние элементы добавляются в конец.

Обратите внимание, что порядок списка изменяется, когда дочерние элементы QWidget поднимаются или опускаются. Поднятый виджет становится последним объектом в списке, а опущенный виджет становится первым объектом в списке.

См. также findChild(), findChildren(), parent() и setParent().

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

Создает подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.

При указании сигнала и метода необходимо использовать макросы SIGNAL() и SLOT(), например:

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

Этот пример гарантирует, что метка всегда отображает текущее значение полосы прокрутки. Обратите внимание, что параметры сигнала и слота не должны содержать никаких имен переменных, только тип. Например, следующее не сработает и вернет false:

// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                 label, SLOT(setNum(int value)));

Сигнал также может быть подключен к другому сигналу:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget();

signals:
    void buttonClicked();

private:
    QPushButton *myButton;
};

MyWidget::MyWidget()
{
    myButton = new QPushButton(this);
    connect(myButton, SIGNAL(clicked()),
            this, SIGNAL(buttonClicked()));
}

В этом примере конструктор MyWidget пересылает сигнал от частного члена переменной и делает его доступным под именем, связанным с MyWidget.

Один сигнал может быть подключен к множеству слотов и сигналов. Множество сигналов может быть подключено к одному слоту.

Если сигнал подключен к нескольким слотам, слоты активируются в том же порядке, в котором были созданы подключения, при отправке сигнала.

Функция возвращает QMetaObject::Connection, представляющий дескриптор подключения, если подключение сигнала к слоту успешно выполнено. Дескриптор подключения будет недопустимым, если подключение не может быть создано, например, если QObject не может проверить существование сигнала или метода или если их сигнатуры несовместимы. Вы можете проверить, является ли дескриптор допустимым, приведён его к типу bool.

По умолчанию для каждого подключения генерируется сигнал; для дубликатов подключений генерируются два сигнала. Все эти подключения можно разорвать одним вызовом disconnect(). Если вы передадите Qt::UniqueConnection в type, подключение будет выполнено только в том случае, если оно не является дубликатом. Если уже существует дубликат (один и тот же сигнал к одному и тому же слоту для одних и тех же объектов), подключение завершится неудачно, и connect вернёт недопустимый QMetaObject::Connection.

Примечание: Qt::UniqueConnections не работают для лямбда-выражений, функций вне класса и функторов; они применяются только к подключению к методам класса.

Необязательный параметр type описывает тип подключения. В частности, он определяет, будет ли сигнал, отправленный в слот, выдан немедленно или помещён в очередь для обработки позже. Если сигнал помещается в очередь, параметры должны быть типов, известных мета-объектной системе Qt, потому что Qt должна копировать аргументы для их хранения в событии.

Если при использовании подключений в очереди возникает сообщение об ошибке:

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных перед созданием подключения.

Примечание: Эта функция безопасна в многопоточной среде.

См. также disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE() и Различия между подключениями на основе строк и подключениями на основе функторов.

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)

Создаёт подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.

Дескриптор подключения будет недопустимым, если подключение не может быть создано, например, из-за некорректных параметров. Вы можете проверить, является ли QMetaObject::Connection допустимым, приведён его к типу bool.

Эта функция работает так же, как и connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type), но использует QMetaMethod для указания сигнала и метода.

См. также connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type).

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const

Эта функция перегружает connect().

Подключает сигнал из объекта sender к методу этого объекта.

Эквивалентно connect(sender, signal, this, method, type).

Каждое подключение генерирует сигнал, поэтому дублирующие подключения генерируют два сигнала. Подключение можно разорвать с помощью disconnect().

Примечание: Эта функция безопасна в многопоточной среде.

См. также disconnect().

[static] template <typename PointerToMemberFunction> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

Эта функция перегружает connect().

Создает подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.

Сигнал должен быть функцией, объявленной как сигнал в заголовке. Функция-слот может быть любым членом функции, который может быть подключен к сигналу. Слот может быть подключён к данному сигналу, если у сигнала по крайней мере столько же аргументов, сколько и у слота, и существует неявное преобразование между типами соответствующих аргументов в сигнале и слоте.

Пример:

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

В этом примере гарантируется, что метка всегда отображает текущий текст текстового поля.

Один сигнал может быть подключен к множеству слотов и сигналов. Множество сигналов может быть подключено к одному слоту.

Если сигнал подключен к нескольким слотам, слоты активируются в том же порядке, в котором были установлены подключения, при отправке сигнала.

Функция возвращает дескриптор подключения, если подключение сигнала к слоту выполняется успешно. Дескриптор подключения будет недопустимым, если подключение не может быть создано, например, если QObject не может проверить существование сигнала (если он не был объявлен как сигнал). Вы можете проверить, является ли QMetaObject::Connection допустимым, приведён его к типу bool.

По умолчанию для каждого подключения генерируется сигнал; для дубликатов подключений генерируются два сигнала. Все эти подключения можно разорвать одним вызовом disconnect(). Если вы передадите Qt::UniqueConnection в type, подключение будет выполнено только в том случае, если оно не является дубликатом. Если уже существует дубликат (один и тот же сигнал к одному и тому же слоту для одних и тех же объектов), подключение завершится неудачно, и connect вернёт недопустимый QMetaObject::Connection.

Необязательный параметр type описывает тип подключения. В частности, он определяет, будет ли сигнал, отправленный в слот, выдан немедленно или помещён в очередь для обработки позже. Если сигнал помещается в очередь, параметры должны быть типов, известных мета-объектной системе Qt, потому что Qt должна копировать аргументы для их хранения в событии.

Если при использовании подключений в очереди возникает сообщение об ошибке:

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

убедитесь, что тип аргумента объявлен с помощью Q_DECLARE_METATYPE.

Перегруженные функции могут быть разрешены с помощью qOverload.

Примечание: Эта функция безопасна в многопоточной среде.

См. также Различия между подключениями на основе строк и подключениями на основе функторов.

END_OF_DOCUMENT_MARKER

[static] шаблон <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

Эта функция перегружает connect().

Создаёт соединение от signal в объекте sender к functor и возвращает дескриптор соединения.

Сигнал должен быть функцией, объявленной как сигнал в заголовке. Функция-слот может быть любой функцией или функтором, который может быть подключён к сигналу. Функция-слот может быть подключена к данному сигналу, если сигнал имеет по крайней мере столько же аргументов, сколько и функция-слот. Должно быть явное преобразование между типами соответствующих аргументов в сигнале и слоте.

Пример:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

Также можно использовать лямбда-выражения:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
        socket->write("GET " + page + "\r\n");
    });

Соединение будет автоматически отключено, если отправитель уничтожен. Однако вы должны позаботиться о том, чтобы все объекты, используемые в функторе, оставались живыми, когда сигнал отправляется.

Перегруженные функции могут быть разрешены с помощью qOverload.

Примечание: Эта функция потокобезопасна.

[static, since 5.2] шаблон <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

Эта функция перегружает connect().

Создаёт соединение заданного type от signal в объекте sender к functor, которое будет размещено в определённой очереди событий context, и возвращает дескриптор соединения.

Примечание: Qt::UniqueConnections не работают для лямбда-выражений, функций и функторов; они применяются только к подключению к функциям-членам.

Сигнал должен быть функцией, объявленной как сигнал в заголовке. Функция-слот может быть любой функцией или функтором, которые могут быть подключены к сигналу. Функция-слот может быть подключена к данному сигналу, если сигнал имеет по крайней мере столько же аргументов, сколько и функция-слот. Должно быть явное преобразование между типами соответствующих аргументов в сигнале и слоте.

Пример:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection);

Также можно использовать лямбда-выражения:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, this, [=] () {
        socket->write("GET " + page + "\r\n");
    }, Qt::AutoConnection);

Соединение будет автоматически отключено, если отправитель или контекст уничтожены. Однако вы должны позаботиться о том, чтобы все объекты, используемые в функторе, оставались живыми, когда сигнал отправляется.

Перегруженные функции могут быть разрешены с помощью qOverload.

Примечание: Эта функция потокобезопасна.

Эта функция была представлена в Qt 5.2.

[virtual protected, since 5.0] void QObject::connectNotify(const QMetaMethod &signal)

Эта виртуальная функция вызывается, когда что-то подключено к signal в этом объекте.

Если вы хотите сравнить signal со специфичным сигналом, вы можете использовать QMetaMethod::fromSignal() следующим образом:

if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
    // signal is valueChanged
}

Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако она может быть полезна, когда вам нужно выполнить дорогостоящую инициализацию только в том случае, если что-то подключено к сигналу.

Предупреждение: Эта функция вызывается из потока, который выполняет подключение, что может быть другим потоком, нежели поток, в котором живёт этот объект.

Эта функция была представлена в Qt 5.0.

См. также connect() и disconnectNotify().

[virtual protected] void QObject::customEvent(QEvent *event)

Этот обработчик событий может быть переопределён в подклассе для получения пользовательских событий. Пользовательские события — это пользовательские события с типом, по крайней мере, таким же большим, как QEvent::User в перечислении QEvent::Type, и обычно это подкласс QEvent. Событие передаётся в параметре event.

См. также event() и QEvent.

[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

Отключает signal в объекте sender от method в объекте receiver. Возвращает true если соединение успешно разорвано; в противном случае возвращает false.

Соединение сигнал-слот удаляется, когда любой из участвующих объектов уничтожен.

disconnect() обычно используется тремя способами, как показано в следующих примерах.

  1. Отключить всё, что подключено к сигналам объекта:
    disconnect(myObject, nullptr, nullptr, nullptr);

    эквивалентно нестатической перегруженной функции

    myObject->disconnect();
  2. Отключить всё, что подключено к определённому сигналу:
    disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);

    эквивалентно нестатической перегруженной функции

    myObject->disconnect(SIGNAL(mySignal()));
  3. Отключить определённого получателя:
    disconnect(myObject, nullptr, myReceiver, nullptr);

    эквивалентно нестатической перегруженной функции

    myObject->disconnect(myReceiver);

nullptr может быть использовано как подстановочное значение, означающее "любой сигнал", "любой объект-получатель" или "любой слот в объекте-получателе", соответственно.

sender никогда не может быть nullptr. (Вы не можете отключить сигналы от более чем одного объекта в одном вызове.)

Если signal равно nullptr, это отключает receiver и method от любого сигнала. Если нет, то отключён только указанный сигнал.

Если receiver равно nullptr, это отключает всё, что подключено к signal. Если нет, слоты в объектах, отличных от receiver, не отключаются.

Если method равно nullptr, это отключает всё, что подключено к receiver. Если нет, будут отключены только слоты с именем method, а все остальные слоты оставлены. method должен быть nullptr если receiver пропущен, поэтому вы не можете отключить конкретно названный слот для всех объектов.

Примечание: Отключение всех соединений сигнал-слот также отключит сигнал QObject::destroyed(), если он подключен. Это может негативно сказаться на классах, которые полагаются на этот сигнал для очистки ресурсов. Рекомендуется отключать только те сигналы, которые были подключены кодом приложения.

Примечание: Эта функция потокобезопасна.

См. также connect().

[static] bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)

Отключает signal в объекте sender от method в объекте receiver. Возвращает true если соединение успешно разорвано; в противном случае возвращает false.

Эта функция предоставляет те же возможности, что и disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method), но использует QMetaMethod для представления сигнала и метода, подлежащих отключению.

Кроме того, эта функция возвращает false и не отключает никакие сигналы и слоты, если:

  1. signal не является членом класса sender или одного из его родительских классов.
  2. method не является членом класса receiver или одного из его родительских классов.
  3. signal экземпляр не представляет собой сигнал.

QMetaMethod() может быть использовано как подстановочное значение в смысле "любой сигнал" или "любой слот в получающем объекте". Аналогично, nullptr может использоваться для receiver в смысле "любой объект-получатель". В этом случае метод также должен быть QMetaMethod(). Параметр sender никогда не должен быть nullptr.

Примечание: Отключение всех соединений сигнал-слот также отключит сигнал QObject::destroyed(), если он подключен. Это может негативно сказаться на классах, которые полагаются на этот сигнал для очистки ресурсов. Рекомендуется отключать только те сигналы, которые были подключены кодом приложения.

См. также disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method).

bool QObject::disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const

Эта функция перегружает disconnect().

Отключает signal от method объекта receiver.

Соединение сигнал-слот удаляется, когда любой из участвующих объектов уничтожен.

Примечание: Отключение всех соединений сигнал-слот также отключит сигнал QObject::destroyed(), если он подключен. Это может негативно сказаться на классах, которые полагаются на этот сигнал для очистки ресурсов. Рекомендуется отключать только те сигналы, которые были подключены кодом приложения.

Примечание: Эта функция потокобезопасна.

bool QObject::disconnect(const QObject *receiver, const char *method = nullptr) const

Эта функция перегружает disconnect().

Отключает все сигналы в этом объекте от method объекта receiver.

Соединение сигнал-слот удаляется, когда любой из участвующих объектов уничтожен.

[static] bool QObject::disconnect(const QMetaObject::Connection &connection)

Отключить соединение.

Если соединение недействительно или уже отключено, ничего не делать и вернуть false.

См. также connect().

[static] шаблон <typename PointerToMemberFunction> bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)

Эта функция перегружает disconnect().

Отключает signal в объекте sender от method в объекте receiver. Возвращает true если соединение успешно разорвано; в противном случае возвращает false.

Соединение сигнал-слот удаляется, когда один из участвующих объектов уничтожен.

disconnect() обычно используется тремя способами, как показано в следующих примерах.

  1. Отключить всё, подключенное к сигналам объекта:
    disconnect(myObject, nullptr, nullptr, nullptr);
  2. Отключить всё, подключенное к определённому сигналу:
    disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
  3. Отключить определённого получателя:
    disconnect(myObject, nullptr, myReceiver, nullptr);
  4. Отключить соединение от одного конкретного сигнала к определённому слоту:
    QObject::disconnect(lineEdit, &QLineEdit::textChanged,
                     label,  &QLabel::setText);

nullptr может использоваться как универсальный символ, означающий соответственно "любой сигнал", "любой объект-получатель" или "любой слот в объекте-получателе".

sender никогда не должен быть nullptr. (Вы не можете отключить сигналы от более чем одного объекта в одном вызове.)

Если signal равно nullptr, это отключает receiver и method от любого сигнала. Если нет, то отключается только указанный сигнал.

Если receiver равно nullptr, это отключает всё, подключенное к signal. Если нет, то отключаются только слоты в указанном получателе. disconnect() с ненулевым receiver также отключает функции слотов, которые были подключены с receiver в качестве объекта контекста.

Если method равно nullptr, это отключает всё, подключенное к receiver. Если нет, то отключаются только слоты с именем method, а все остальные слоты остаются нетронутыми. method должен быть nullptr если receiver опущен, поэтому вы не можете отключить конкретно названный слот на всех объектах.

Примечание: Невозможно использовать эту перегрузку для отключения сигналов, подключенных к функциональным объектам или лямбда-выражениям. Это связано с тем, что их нельзя сравнить. Используйте вместо этого перегрузку, принимающую QMetaObject::Connection

Примечание: Эта функция безопасна для потоков.

См. также connect().

[virtual protected, since 5.0] void QObject::disconnectNotify(const QMetaMethod &signal)

Эта виртуальная функция вызывается, когда что-то отключено от signal в этом объекте.

См. connectNotify() для примера того, как сравнить signal с определённым сигналом.

Если все сигналы были отключены от этого объекта (например, аргумент сигнала в disconnect() был nullptr), disconnectNotify() вызывается только один раз, и signal будет недействительным QMetaMethod (QMetaMethod::isValid() возвращает false).

Предупреждение: Эта функция нарушает принцип объектно-ориентированной модульности. Однако она может быть полезна для оптимизации доступа к ресурсам с высокой стоимостью.

Предупреждение: Эта функция вызывается из потока, который выполняет отключение, что может быть другим потоком, чем поток, в котором существует этот объект. Эта функция также может быть вызвана с заблокированным внутренним мьютексом QObject. Поэтому вам запрещено повторно входить в какие-либо функции QObject из вашей переопределённой реализации, и если вы блокируете мьютекс в своей переопределённой реализации, убедитесь, что вы не вызываете функции QObject с заблокированным мьютексом в других местах, иначе это приведёт к тупику.

Эта функция была добавлена в Qt 5.0.

См. также disconnect() и connectNotify().

void QObject::dumpObjectInfo() const

Выводит информацию о соединениях сигналов и т. д. для этого объекта в вывод отладки.

Примечание: до Qt 5.9 эта функция не была const.

См. также dumpObjectTree().

void QObject::dumpObjectTree() const

Выводит дерево дочерних элементов в вывод отладки.

Примечание: до Qt 5.9 эта функция не была const.

См. также dumpObjectInfo().

QList<QByteArray> QObject::dynamicPropertyNames() const

Возвращает имена всех свойств, которые были динамически добавлены в объект с помощью setProperty().

[virtual] bool QObject::event(QEvent *e)

Эта виртуальная функция получает события объекта и должна возвращать true, если событие e было распознано и обработано.

Функция event() может быть переопределена для настройки поведения объекта.

Убедитесь, что вы вызываете реализацию родительского класса событий для всех событий, которые вы не обрабатывали.

Пример:

class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = nullptr);
    ~MyClass();

    bool event(QEvent* ev) override
    {
        if (ev->type() == QEvent::PolishRequest) {
            // overwrite handling of PolishRequest if any
            doThings();
            return true;
        } else  if (ev->type() == QEvent::Show) {
            // complement handling of Show if any
            doThings2();
            QWidget::event(ev);
            return true;
        }
        // Make sure the rest of events are handled
        return QWidget::event(ev);
    }
};

См. также installEventFilter(), timerEvent(), QCoreApplication::sendEvent() и QCoreApplication::postEvent().

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

Фильтрует события, если этот объект был установлен как фильтр событий для объекта watched.

В вашей переопределённой реализации, если вы хотите отфильтровать event, т. е. остановить его дальнейшую обработку, верните true; в противном случае верните false.

Пример:

class MainWindow : public QMainWindow
{
public:
    MainWindow();

protected:
    bool eventFilter(QObject *obj, QEvent *ev) override;

private:
    QTextEdit *textEdit;
};

MainWindow::MainWindow()
{
    textEdit = new QTextEdit;
    setCentralWidget(textEdit);

    textEdit->installEventFilter(this);
}

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == textEdit) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
            qDebug() << "Ate key press" << keyEvent->key();
            return true;
        } else {
            return false;
        }
    } else {
        // pass the event on to the parent class
        return QMainWindow::eventFilter(obj, event);
    }
}

Обратите внимание в примере выше, что необработанные события передаются функции eventFilter() базового класса, так как базовый класс может переопределить eventFilter() для своих внутренних целей.

Некоторые события, такие как QEvent::ShortcutOverride, должны быть явно приняты (вызвав accept() на них), чтобы предотвратить распространение.

Предупреждение: Если вы удаляете объект получателя в этой функции, обязательно возвращайте true. В противном случае Qt перенаправит событие удалённому объекту, и программа может аварийно завершиться.

См. также installEventFilter().

шаблон <typename T> T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Возвращает дочерний объект этого объекта, который можно привести к типу T и который называется name, или nullptr если такого объекта нет. Опуская аргумент name, все имена объектов будут сопоставлены. Поиск выполняется рекурсивно, если options не указывает опцию FindDirectChildrenOnly.

Если существует более одного дочернего объекта, соответствующего поиску, возвращается самый непосредственный предок. Если есть несколько непосредственных предков, какой из них будет возвращён, не определено. В этом случае следует использовать findChildren().

Этот пример возвращает дочерний объект QPushButton объекта parentWidget с именем "button1", даже если кнопка не является непосредственным потомком родителя:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

Этот пример возвращает дочерний объект QListWidget объекта parentWidget:

QListWidget *list = parentWidget->findChild<QListWidget *>();

Этот пример возвращает дочерний объект QPushButton объекта parentWidget (его непосредственного родителя) с именем "button1":

QPushButton *button = parentWidget->findChild<QPushButton *>("button1", Qt::FindDirectChildrenOnly);

Этот пример возвращает дочерний объект QListWidget объекта parentWidget, его непосредственного родителя:

QListWidget *list = parentWidget->findChild<QListWidget *>(QString(), Qt::FindDirectChildrenOnly);

См. также findChildren().

шаблон <typename T> QList<T> QObject::findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Возвращает все дочерние объекты этого объекта с заданным name, которые можно привести к типу T, или пустой список, если таких объектов нет. Опуская аргумент name, все имена объектов будут сопоставлены. Поиск выполняется рекурсивно, если options не указывает опцию FindDirectChildrenOnly.

Следующий пример показывает, как найти список дочерних объектов QWidget указанного объекта parentWidget с именем widgetname:

QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");

Этот пример возвращает все объекты QPushButton являющиеся потомками объекта parentWidget:

QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();

Этот пример возвращает все объекты QPushButton являющиеся непосредственными потомками объекта parentWidget:

QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);

См. также findChild().

[since 5.0] шаблон <typename T> QList<T> QObject::findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Эта функция перегружает findChildren().

Возвращает дочерние объекты этого объекта, которые можно привести к типу T и чьи имена соответствуют регулярному выражению re, или пустой список, если таких объектов нет. Поиск выполняется рекурсивно, если options не указывает опцию FindDirectChildrenOnly.

Эта функция была добавлена в Qt 5.0.

bool QObject::inherits(const char *className) const

Возвращает true если этот объект является экземпляром класса, унаследованного от класса className, или подкласса QObject, который унаследован от className; в противном случае возвращает false.

Класс считается унаследованным от самого себя.

Пример:

QTimer *timer = new QTimer;         // QTimer inherits QObject
timer->inherits("QTimer");          // returns true
timer->inherits("QObject");         // returns true
timer->inherits("QAbstractButton"); // returns false

// QVBoxLayout inherits QObject and QLayoutItem
QVBoxLayout *layout = new QVBoxLayout;
layout->inherits("QObject");        // returns true
layout->inherits("QLayoutItem");    // returns true (even though QLayoutItem is not a QObject)

Если вам нужно определить, является ли объект экземпляром определенного класса для целей приведения типов, рассмотрите использование qobject_cast<Type *>(object) вместо этого.

См. также metaObject() и qobject_cast().

void QObject::installEventFilter(QObject *filterObj)

Устанавливает обработчик событий filterObj для этого объекта. Например:

monitoredObj->installEventFilter(filterObj);

Обработчик событий — это объект, который получает все события, отправленные этому объекту. Обработчик может либо остановить событие, либо передать его этому объекту. Обработчик событий filterObj получает события через свою функцию eventFilter(). Функция eventFilter() должна возвращать true, если событие должно быть отфильтровано (т. е. остановлено); в противном случае она должна возвращать false.

Если на одном объекте установлено несколько обработчиков событий, обработчик, установленный последним, активируется первым.

Вот класс KeyPressEater , который перехватывает нажатия клавиш на своих наблюдаемых объектах:

class KeyPressEater : public QObject
{
    Q_OBJECT
    ...

protected:
    bool eventFilter(QObject *obj, QEvent *event) override;
};

bool KeyPressEater::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        qDebug("Ate key press %d", keyEvent->key());
        return true;
    } else {
        // standard event processing
        return QObject::eventFilter(obj, event);
    }
}

А вот как установить его на два виджета:

KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);

pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);

Например, класс QShortcut использует эту технику для перехвата нажатий клавиш сочетаний.

Предупреждение: Если вы удаляете объект получателя в своей функции eventFilter(), обязательно возвращайте true. Если вы вернете false, Qt отправит событие удаленному объекту, и программа завершится аварийно.

Обратите внимание, что объект фильтрации должен находиться в той же потоковой нити, что и этот объект. Если filterObj находится в другой потоковой нити, эта функция ничего не делает. Если либо filterObj, либо этот объект перемещены в другую потоковую нить после вызова этой функции, обработчик событий не будет вызываться, пока оба объекта не будут снова иметь ту же привязанность к потоку (он не удаляется).

См. также removeEventFilter(), eventFilter() и event().

[protected, since 5.0] bool QObject::isSignalConnected(const QMetaMethod &signal) const

Возвращает true если signal подключена хотя бы к одному получателю, в противном случае возвращает false.

signal должна быть сигнальной частью этого объекта, в противном случае поведение не определено.

static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
    QByteArray data;
    data = get_the_value();       // expensive operation
    emit valueChanged(data);
}

Как иллюстрирует фрагмент кода выше, вы можете использовать эту функцию, чтобы избежать отправки сигнала, на который никто не подписан.

Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако она может быть полезной, когда вам нужно выполнить дорогостоящую инициализацию только в том случае, если к сигналу подключено что-либо.

Эта функция была добавлена в Qt 5.0.

bool QObject::isWidgetType() const

Возвращает true если объект является виджетом; в противном случае возвращает false.

Вызов этой функции эквивалентен вызову inherits("QWidget"), за исключением того, что она намного быстрее.

bool QObject::isWindowType() const

Возвращает true если объект является окном; в противном случае возвращает false.

Вызов этой функции эквивалентен вызову inherits("QWindow"), за исключением того, что она намного быстрее.

void QObject::killTimer(int id)

Останавливает таймер с идентификатором id.

Идентификатор таймера возвращается функцией startTimer() при запуске события таймера.

См. также timerEvent() и startTimer().

[virtual] const QMetaObject *QObject::metaObject() const

Возвращает указатель на метаобъект этого объекта.

Метаобъект содержит информацию о классе, унаследованном от QObject, например, имя класса, имя суперкласса, свойства, сигналы и слоты. Каждый подкласс QObject, содержащий макрос Q_OBJECT, будет иметь метаобъект.

Информация о метаобъекте необходима для механизма подключения сигналов/слотов и системы свойств. Функция inherits() также использует метаобъект.

Если у вас нет указателя на фактический экземпляр объекта, но вы всё равно хотите получить доступ к метаобъекту класса, вы можете использовать staticMetaObject.

Пример:

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

QPushButton::staticMetaObject.className();  // returns "QPushButton"

См. также staticMetaObject.

void QObject::moveToThread(QThread *targetThread)

Изменяет привязанность к потоку для этого объекта и его дочерних элементов. Объект не может быть перемещен, если у него есть родитель. Обработка событий будет продолжаться в потоке targetThread.

Чтобы переместить объект в главный поток, используйте QApplication::instance() для получения указателя на текущее приложение и QApplication::thread() для получения потока, в котором живет приложение. Например:

myObject->moveToThread(QApplication::instance()->thread());

Если targetThread равно nullptr, вся обработка событий для этого объекта и его дочерних элементов останавливается, так как они больше не связаны ни с одним потоком.

Обратите внимание, что все активные таймеры объекта будут сброшены. Таймеры сначала останавливаются в текущем потоке и перезапускаются (с тем же интервалом) в потоке targetThread. В результате постоянное перемещение объекта между потоками может неопределённо откладывать события таймера.

Объекту отправляется событие QEvent::ThreadChange непосредственно перед изменением привязанности к потоку. Вы можете обработать это событие, чтобы выполнить любую специальную обработку. Обратите внимание, что все новые события, которые отправляются этому объекту, будут обрабатываться в потоке targetThread, при условии, что он не nullptr: когда он nullptr, обработка событий для этого объекта или его дочерних элементов не может происходить, так как они больше не связаны ни с одним потоком.

Предупреждение: Эта функция не потокобезопасна; текущая потоковая нить должна совпадать с текущей привязкой к потоку. Другими словами, эта функция только может "переместить" объект из текущего потока в другой поток, она не может "переместить" объект из любого произвольного потока в текущий поток. Однако есть одно исключение из этого правила: объекты без привязки к потоку могут быть "перемещены" в текущий поток.

См. также thread().

QObject *QObject::parent() const

Возвращает указатель на родительский объект.

См. также setParent() и children().

QVariant QObject::property(const char *name) const

Возвращает значение свойства объекта с именем name.

Если такого свойства не существует, возвращаемая переменная недействительна.

Информация обо всех доступных свойствах предоставляется через metaObject() и dynamicPropertyNames().

См. также setProperty(), QVariant::isValid(), metaObject() и dynamicPropertyNames().

[protected] int QObject::receivers(const char *signal) const

Возвращает количество получателей, подключенных к сигналу signal.

Поскольку и слоты, и сигналы могут использоваться в качестве получателей сигналов, и одни и те же подключения могут выполняться многократно, количество получателей равно количеству созданных подключений от этого сигнала.

При вызове этой функции можно использовать макрос SIGNAL() для передачи определенного сигнала:

if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
    QByteArray data;
    get_the_value(&data);       // expensive operation
    emit valueChanged(data);
}

Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако она может быть полезна, когда вам нужно выполнить дорогостоящую инициализацию только в том случае, если к сигналу подключено что-либо.

См. также isSignalConnected().

void QObject::removeEventFilter(QObject *obj)

Удаляет объект обработчика событий obj из этого объекта. Запрос игнорируется, если такой обработчик событий не был установлен.

Все обработчики событий для этого объекта автоматически удаляются при уничтожении этого объекта.

Удаление обработчика событий всегда безопасно, даже во время его активации (т. е. из функции eventFilter()).

См. также installEventFilter(), eventFilter() и event().

[protected] QObject *QObject::sender() const

Возвращает указатель на объект, отправивший сигнал, если вызвана в слоте, активированном сигналом; в противном случае возвращает nullptr. Указатель действителен только во время выполнения слота, который вызывает эту функцию из контекста потока этого объекта.

Указатель, возвращаемый этой функцией, становится недействительным, если отправитель уничтожен или если слот отключен от сигнала отправителя.

Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако доступ к отправителю может быть полезен, когда много сигналов подключено к одному слоту.

Предупреждение: Как упоминалось выше, значение возврата этой функции недействительно, когда слот вызывается через Qt::DirectConnection из потока, отличного от потока этого объекта. Не используйте эту функцию в таких сценариях.

См. также senderSignalIndex().

[protected] int QObject::senderSignalIndex() const

Возвращает индекс мета-метода сигнала, который вызвал текущий выполняемый слот, который является членом класса, возвращённого функцией sender(). Если вызов произошёл вне слота, активированного сигналом, возвращается -1.

Для сигналов с параметрами по умолчанию эта функция всегда вернёт индекс со всеми параметрами, независимо от того, какой был использован с connect(). Например, сигнал destroyed(QObject *obj = \nullptr) будет иметь два разных индекса (с параметром и без него), но эта функция всегда вернёт индекс с параметром. Это не относится к перегрузке сигналов с различными параметрами.

Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако доступ к индексу сигнала может быть полезен, когда к одному слоту подключено много сигналов.

Предупреждение: Значение, возвращаемое этой функцией, недействительно, когда слот вызывается через Qt::DirectConnection из потока, отличного от потока этого объекта. Не используйте эту функцию в этом типе сценариев.

См. также sender(), QMetaObject::indexOfSignal и QMetaObject::method().

void QObject::setParent(QObject *parent)

Делает объект дочерним для parent.

См. также parent() и children().

bool QObject::setProperty(const char *name, const QVariant &value)

Устанавливает значение свойства объекта name на value.

Если свойство определено в классе с помощью Q_PROPERTY, то при успехе возвращается true, в противном случае — false. Если свойство не определено с помощью Q_PROPERTY и, следовательно, не указано в метаобъекте, оно добавляется как динамическое свойство, и возвращается false.

Информация обо всех доступных свойствах предоставляется через metaObject() и dynamicPropertyNames().

Динамические свойства можно запросить повторно с помощью property(), и их можно удалить, установив значение свойства на недействительный QVariant. Изменение значения динамического свойства вызывает отправку события QDynamicPropertyChangeEvent объекту.

Примечание: Динамические свойства, начинающиеся с «_q_», зарезервированы для внутренних целей.

См. также property(), metaObject(), dynamicPropertyNames() и QMetaProperty::write().

bool QObject::signalsBlocked() const

Возвращает true если сигналы заблокированы; в противном случае возвращает false.

По умолчанию сигналы не заблокированы.

См. также blockSignals() и QSignalBlocker.

int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)

Запускает таймер и возвращает идентификатор таймера или ноль, если запуск не удался.

Событие таймера будет происходить каждые interval миллисекунд до тех пор, пока не будет вызван killTimer(). Если interval равно 0, событие таймера происходит каждый раз, когда больше нет событий системы окон.

Виртуальная функция timerEvent() вызывается с классом события QTimerEvent в качестве параметра при возникновении события таймера. Переопределите эту функцию, чтобы получать события таймера.

Если запущено несколько таймеров, QTimerEvent::timerId() можно использовать для определения, какой таймер был активирован.

Пример:

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = nullptr);

protected:
    void timerEvent(QTimerEvent *event) override;
};

MyObject::MyObject(QObject *parent)
    : QObject(parent)
{
    startTimer(50);     // 50-millisecond timer
    startTimer(1000);   // 1-second timer
    startTimer(60000);  // 1-minute timer

    using namespace std::chrono;
    startTimer(milliseconds(50));
    startTimer(seconds(1));
    startTimer(minutes(1));

    // since C++14 we can use std::chrono::duration literals, e.g.:
    startTimer(100ms);
    startTimer(5s);
    startTimer(2min);
    startTimer(1h);
}

void MyObject::timerEvent(QTimerEvent *event)
{
    qDebug() << "Timer ID:" << event->timerId();
}

Обратите внимание, что точность QTimer зависит от используемой операционной системы и аппаратного обеспечения. Аргумент timerType позволяет настроить точность таймера. См. Qt::TimerType для получения информации о разных типах таймеров. Большинство платформ поддерживают точность 20 миллисекунд; некоторые — больше. Если Qt не может доставить требуемое количество событий таймера, то некоторые события будут проигнорированы.

Класс QTimer предоставляет высокоуровневый интерфейс программирования с таймерами с однократным запуском и сигналами таймера вместо событий. Также есть класс QBasicTimer, который легче QTimer и менее громоздкий, чем использование идентификаторов таймеров напрямую.

См. также timerEvent(), killTimer() и QTimer::singleShot().

[since 5.9] int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)

Это перегруженная функция.

Запускает таймер и возвращает идентификатор таймера или ноль, если запуск не удался.

Событие таймера будет происходить каждые time интервалы до тех пор, пока не будет вызван killTimer(). Если time равно std::chrono::duration::zero(), тогда событие таймера происходит каждый раз, когда больше нет событий системы окон.

Виртуальная функция timerEvent() вызывается с классом события QTimerEvent в качестве параметра при возникновении события таймера. Переопределите эту функцию, чтобы получать события таймера.

Если запущено несколько таймеров, QTimerEvent::timerId() можно использовать для определения, какой таймер был активирован.

Пример:

class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject *parent = nullptr);

protected:
    void timerEvent(QTimerEvent *event) override;
};

MyObject::MyObject(QObject *parent)
    : QObject(parent)
{
    startTimer(50);     // 50-millisecond timer
    startTimer(1000);   // 1-second timer
    startTimer(60000);  // 1-minute timer

    using namespace std::chrono;
    startTimer(milliseconds(50));
    startTimer(seconds(1));
    startTimer(minutes(1));

    // since C++14 we can use std::chrono::duration literals, e.g.:
    startTimer(100ms);
    startTimer(5s);
    startTimer(2min);
    startTimer(1h);
}

void MyObject::timerEvent(QTimerEvent *event)
{
    qDebug() << "Timer ID:" << event->timerId();
}

Обратите внимание, что точность QTimer зависит от используемой операционной системы и аппаратного обеспечения. Аргумент timerType позволяет настроить точность таймера. См. Qt::TimerType для получения информации о разных типах таймеров. Большинство платформ поддерживают точность 20 миллисекунд; некоторые — больше. Если Qt не может доставить требуемое количество событий таймера, то некоторые события будут проигнорированы.

Класс QTimer предоставляет высокоуровневый интерфейс программирования с таймерами с однократным запуском и сигналами таймера вместо событий. Также есть класс QBasicTimer, который легче QTimer и менее громоздкий, чем использование идентификаторов таймеров напрямую.

Эта функция была добавлена в Qt 5.9.

См. также timerEvent(), killTimer() и QTimer::singleShot().

QThread *QObject::thread() const

Возвращает поток, в котором живёт объект.

См. также moveToThread().

[virtual protected] void QObject::timerEvent(QTimerEvent *event)

Обработчик событий, который можно переопределить в подклассе для получения событий таймера для объекта.

QTimer предоставляет высокоуровневый интерфейс к функциональности таймера и также содержит более общую информацию о таймерах. Событие таймера передаётся в параметре event.

См. также startTimer(), killTimer() и event().

[static] QString QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

Возвращает переведённую версию sourceText, необязательно основанную на строке disambiguation и значении n для строк, содержащих множественное число; в противном случае возвращает QString::fromUtf8(sourceText), если соответствующей переведённой строки нет.

Пример:

void MainWindow::createActions()
{
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    ...

Если один и тот же sourceText используется в разных ролях в одном контексте, может быть передана дополнительная идентифицирующая строка в disambiguation (nullptr по умолчанию). В Qt 4.4 и более ранних версиях это был предпочтительный способ передачи комментариев переводчикам.

Пример:

MyWindow::MyWindow()
{
    QLabel *senderLabel = new QLabel(tr("Name:"));
    QLabel *recipientLabel = new QLabel(tr("Name:", "recipient"));
    ...

См. Написание исходного кода для перевода для подробного описания механизмов перевода Qt в целом и раздел Разъяснение неоднозначностей для информации о разъяснении неоднозначностей.

Предупреждение: Этот метод реентерабелен только если все переводчики установлены до вызова этого метода. Установка или удаление переводчиков во время перевода не поддерживается. Это может привести к аварийному завершению работы или другому нежелательному поведению.

См. также QCoreApplication::translate() и Международная локализация с Qt.

Документация по переменным-членам

const QMetaObject QObject::staticMetaObject

Эта переменная хранит метаобъект для класса.

Метаобъект содержит информацию о классе, который наследуется от QObject, например, имя класса, имя суперкласса, свойства, сигналы и слоты. Каждый класс, содержащий макрос Q_OBJECT, также будет иметь метаобъект.

Информация метаобъекта необходима для механизма соединения сигналов/слотов и системы свойств. Функция inherits() также использует метаобъект.

Если у вас есть указатель на объект, вы можете использовать metaObject() для извлечения метаобъекта, связанного с этим объектом.

Пример:

QPushButton::staticMetaObject.className();  // returns "QPushButton"

QObject *obj = new QPushButton;
obj->metaObject()->className();             // returns "QPushButton"

См. также metaObject().

Связанные нечлены

template <typename T> T qobject_cast(QObject *object)

template <typename T> T qobject_cast(const QObject *object)

Возвращает указанный object, приведённый к типу T, если объект является объектом типа T (или подкласса); в противном случае возвращает nullptr. Если object равен nullptr, то также возвращает nullptr.

Класс T должен унаследовать (прямо или косвенно) QObject и быть объявлен с помощью макроса Q_OBJECT.

Класс считается наследником самого себя.

Пример:

QObject *obj = new QTimer;          // QTimer inherits QObject

QTimer *timer = qobject_cast<QTimer *>(obj);
// timer == (QObject *)obj

QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
// button == nullptr

Функция qobject_cast() работает аналогично стандартной C++ функции dynamic_cast(), с преимуществами, что не требует поддержки RTTI и работает между динамическими библиотеками.

qobject_cast() также может использоваться совместно с интерфейсами; см. пример Подключение и рисование для получения подробностей.

Предупреждение: Если T не объявлен с помощью макроса Q_OBJECT, поведение этой функции не определено.

См. также QObject::inherits().

QObjectList

Синоним для QList<QObject *>.

Документация по макросам

[since 5.8] QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

Определение этого макроса отключит сужающие и преобразования с плавающей запятой в целые числа между аргументами сигнала и аргументами, принимаемыми слотом, когда сигнал и слот подключены с помощью синтаксиса на основе PMF.

Эта функция была введена в Qt 5.8.

См. также QObject::connect.

Q_CLASSINFO(Имя, Значение)

Этот макрос связывает дополнительную информацию с классом, которая доступна с помощью QObject::metaObject(). Qt использует эту функцию только в ограниченной степени в модулях Qt D-Bus и Qt QML.

Дополнительная информация представлена в виде строки Имя и литеральной строки Значение.

Пример:

class MyClass : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("Author", "Pierre Gendron")
    Q_CLASSINFO("URL", "http://www.my-organization.qc.ca")

public:
    ...
};

См. также QMetaObject::classInfo(), Использование адаптеров Qt D-Bus и Расширение QML.

Q_DISABLE_COPY(Класс)

Отключает использование копирующих конструкторов и операторов присваивания для данного Класса.

Экземпляры подклассов QObject не должны рассматриваться как значения, которые можно копировать или присваивать, а как уникальные идентификаторы. Это означает, что при создании собственного подкласса QObject (директора или косвенного), вы не должны предоставлять ему копирующий конструктор или оператор присваивания. Однако, этого может быть недостаточно, просто опуская их из вашего класса, потому что, если вы по ошибке напишете код, требующий копирующего конструктора или оператора присваивания (это легко сделать), ваш компилятор любезно создаст его для вас. Нужно сделать больше.

Внимательный пользователь заметил, что классы Qt, производные от QObject, обычно включают этот макрос в частной секции:

class MyClass : public QObject
{
private:
    Q_DISABLE_COPY(MyClass)
};

Он объявляет копирующий конструктор и оператор присваивания в частной секции, чтобы, если вы случайно их используете, компилятор выдал ошибку.

class MyClass : public QObject
{
private:
    MyClass(const MyClass &) = delete;
    MyClass &operator=(const MyClass &) = delete;
};

Но даже этого может быть недостаточно, чтобы поймать абсолютно все случаи. Вы можете быть искушены сделать что-то вроде этого:

QWidget w = QWidget();

Во-первых, не делайте этого. Большинство компиляторов сгенерируют код, использующий копирующий конструктор, поэтому ошибка нарушения приватности будет сообщена, но ваш компилятор C++ не обязан генерировать код для этого оператора определенным образом. Он может сгенерировать код, используя ни копирующий конструктор, ни оператор присваивания, которые мы сделали приватными. В этом случае ошибка не будет сообщена, но ваше приложение, вероятно, аварийно завершится при вызове члена функции w.

См. также Q_DISABLE_COPY_MOVE и Q_DISABLE_MOVE.

[since 5.13] Q_DISABLE_COPY_MOVE(Класс)

Удобный макрос, который отключает использование копирующих конструкторов, операторов присваивания, конструкторов перемещения и операторов присваивания перемещения для данного Класса, объединяя Q_DISABLE_COPY и Q_DISABLE_MOVE.

Эта функция была введена в Qt 5.13.

См. также Q_DISABLE_COPY и Q_DISABLE_MOVE.

[since 5.13] Q_DISABLE_MOVE(Класс)

Отключает использование конструкторов перемещения и операторов присваивания перемещения для данного Класса.

Эта функция была введена в Qt 5.13.

См. также Q_DISABLE_COPY и Q_DISABLE_COPY_MOVE.

Q_EMIT

Используйте этот макрос для замены ключевого слова emit для отправки сигналов, когда вы хотите использовать Qt Сигналы и Слоты с механизмом сигналов/слотов сторонних разработчиков.

Макрос обычно используется, когда no_keywords указан с переменной CONFIG в файле .pro, но он может быть использован даже когда no_keywords не указан.

[since 5.5] Q_ENUM(...)

Этот макрос регистрирует тип перечисления в системе метаобъектов. Он должен быть размещён после объявления перечисления в классе, имеющем макрос Q_OBJECT или Q_GADGET. Для пространств имён используйте Q_ENUM_NS() вместо этого.

Например:

class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    void setPriority(Priority priority);
    Priority priority() const;
};

Перечисления, объявленные с помощью Q_ENUM, имеют свои QMetaEnum зарегистрированные в окружающем QMetaObject. Вы также можете использовать QMetaEnum::fromType() для получения QMetaEnum.

Зарегистрированные перечисления автоматически регистрируются также в системе метатипов Qt, делая их известными QMetaType без необходимости использования Q_DECLARE_METATYPE(). Это позволит использовать полезные функции; например, если они используются в QVariant, их можно преобразовать в строки. Аналогично, передача их в QDebug выведет их имена.

Обратите внимание, что значения перечисления хранятся как знаковое int в системе метаобъектов. Регистрация перечислений со значениями, выходящими за пределы диапазона допустимых значений для int, приведёт к переполнению и потенциально неопределённому поведению при доступе к ним через систему метаобъектов. Например, QML обращается к зарегистрированным перечислениям через систему метаобъектов.

Эта функция была введена в Qt 5.5.

См. также Система свойств Qt.

[since 5.8] Q_ENUM_NS(...)

Этот макрос регистрирует тип перечисления в системе метаобъектов. Он должен быть размещён после объявления перечисления в пространстве имён, имеющем макрос Q_NAMESPACE. Он идентичен Q_ENUM, но в пространстве имён.

Перечисления, объявленные с помощью Q_ENUM_NS, имеют свои QMetaEnum зарегистрированные в окружающем QMetaObject. Вы также можете использовать QMetaEnum::fromType() для получения QMetaEnum.

Зарегистрированные перечисления автоматически регистрируются также в системе метатипов Qt, делая их известными QMetaType без необходимости использования Q_DECLARE_METATYPE(). Это позволит использовать полезные функции; например, если они используются в QVariant, их можно преобразовать в строки. Аналогично, передача их в QDebug выведет их имена.

Обратите внимание, что значения перечисления хранятся как знаковое int в системе метаобъектов. Регистрация перечислений со значениями, выходящими за пределы диапазона допустимых значений для int, приведёт к переполнению и потенциально неопределённому поведению при доступе к ним через систему метаобъектов. Например, QML обращается к зарегистрированным перечислениям через систему метаобъектов.

Эта функция была введена в Qt 5.8.

См. также Система свойств Qt.

[since 5.5] Q_FLAG(...)

Этот макрос регистрирует отдельный тип флага тип флагов в системе метаобъектов. Он обычно используется в определении класса для объявления того, что значения данного перечисления могут использоваться как флаги и комбинироваться с помощью оператора побитового ИЛИ. Для пространств имён используйте Q_FLAG_NS() вместо этого.

Макрос должен быть размещён после объявления перечисления. Объявление типа флагов выполняется с помощью макроса Q_DECLARE_FLAGS().

Например, в QItemSelectionModel, флаг SelectionFlags объявлен следующим образом:

class QItemSelectionModel : public QObject
{
    Q_OBJECT

public:
    ...
    enum SelectionFlag {
        NoUpdate       = 0x0000,
        Clear          = 0x0001,
        Select         = 0x0002,
        Deselect       = 0x0004,
        Toggle         = 0x0008,
        Current        = 0x0010,
        Rows           = 0x0020,
        Columns        = 0x0040,
        SelectCurrent  = Select | Current,
        ToggleCurrent  = Toggle | Current,
        ClearAndSelect = Clear | Select
    };

    Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
    Q_FLAG(SelectionFlags)
    ...
}

Примечание: Макрос Q_FLAG заботится о регистрации отдельных значений флагов в системе метаобъектов, поэтому нет необходимости использовать Q_ENUM() дополнительно к этому макросу.

Эта функция была введена в Qt 5.5.

См. также Система свойств Qt.

[since 5.8] Q_FLAG_NS(...)

Этот макрос регистрирует отдельный тип флага тип флагов в системе метаобъектов. Он используется в пространстве имён, имеющем макрос Q_NAMESPACE, для объявления того, что значения данного перечисления могут использоваться как флаги и комбинироваться с помощью оператора побитового ИЛИ. Он идентичен Q_FLAG, но в пространстве имён.

Макрос должен быть размещён после объявления перечисления.

Примечание: Макрос Q_FLAG_NS заботится о регистрации отдельных значений флагов в системе метаобъектов, поэтому нет необходимости использовать Q_ENUM_NS() дополнительно к этому макросу.

Эта функция была введена в Qt 5.8.

См. также Система свойств Qt.

Q_GADGET

Макрос Q_GADGET — это облегчённая версия макроса Q_OBJECT для классов, не наследуемых от QObject, но по-прежнему желающих использовать некоторые возможности отражения, предоставляемые QMetaObject. Как и макрос Q_OBJECT, он должен появляться в частной секции определения класса.

Q_GADGET могут иметь Q_ENUM, Q_PROPERTY и Q_INVOKABLE, но не могут иметь сигналы или слоты.

Q_GADGET делает доступным член класса staticMetaObject. staticMetaObject имеет тип QMetaObject и предоставляет доступ к перечислениям, объявленным с помощью Q_ENUMS.

Q_INTERFACES(...)

Этот макрос сообщает Qt, какие интерфейсы реализует класс. Это используется при реализации плагинов.

Пример:

class BasicToolsPlugin : public QObject,
                         public BrushInterface,
                         public ShapeInterface,
                         public FilterInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface" FILE "basictools.json")
    Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)

public:
    ...
};

Подробности см. в примере Plug & Paint Basic Tools.

См. также Q_DECLARE_INTERFACE(), Q_PLUGIN_METADATA() и Как создавать плагины Qt.

Q_INVOKABLE

Примените этот макрос к объявлениям методов членов, чтобы разрешить их вызов через систему метаобъектов. Макрос записывается перед типом возврата, как показано в следующем примере:

class Window : public QWidget
{
    Q_OBJECT

public:
    Window();
    void normalMethod();
    Q_INVOKABLE void invokableMethod();
};

Функция invokableMethod() помечена с помощью Q_INVOKABLE, что приводит к её регистрации в системе метаобъектов и позволяет вызывать её с помощью QMetaObject::invokeMethod(). Поскольку функция normalMethod() не зарегистрирована таким образом, её нельзя вызвать с помощью QMetaObject::invokeMethod().

Если вызываемая членом функция возвращает указатель на QObject или подкласс QObject, и она вызывается из QML, применяются специальные правила владения. Подробнее см. Преобразование типов данных между QML и C++.

[since 6.0] Q_MOC_INCLUDE

Макрос Q_MOC_INCLUDE может быть использован внутри или вне класса и указывает компилятору метаобъектов Meta Object Compiler на добавление включения.

// Put this in your code and the generated code will include this header.
Q_MOC_INCLUDE("myheader.h")

Это полезно, если типы, используемые в качестве свойств или аргументов сигнала/слота, объявлены предварительно.

Данная функция была введена в Qt 6.0.

[since 5.8] Q_NAMESPACE

Макрос Q_NAMESPACE может быть использован для добавления возможностей QMetaObject в пространство имён.

Q_NAMESPACEs могут содержать Q_CLASSINFO, Q_ENUM_NS, Q_FLAG_NS, но не могут содержать Q_ENUM, Q_FLAG, Q_PROPERTY, Q_INVOKABLE, сигналы или слоты.

Q_NAMESPACE делает доступной внешнюю переменную staticMetaObject. staticMetaObject имеет тип QMetaObject и предоставляет доступ к перечислениям, объявленным с помощью Q_ENUM_NS/Q_FLAG_NS.

Например:

namespace test {
Q_NAMESPACE
...

Данная функция была введена в Qt 5.8.

См. также Q_NAMESPACE_EXPORT.

[since 5.14] Q_NAMESPACE_EXPORT(EXPORT_MACRO)

Макрос Q_NAMESPACE_EXPORT может быть использован для добавления возможностей QMetaObject в пространство имён.

Он работает точно так же, как макрос Q_NAMESPACE. Однако внешняя переменная staticMetaObject , которая определяется в пространстве имён, объявляется с предоставленным квалификатором EXPORT_MACRO. Это полезно, если объект должен быть экспортирован из динамической библиотеки.

Например:

namespace test {
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
...

Данная функция была введена в Qt 5.14.

См. также Q_NAMESPACE и Создание динамических библиотек.

Q_OBJECT

Макрос Q_OBJECT должен находиться в частной секции определения класса, который объявляет свои собственные сигналы и слоты или использует другие сервисы, предоставляемые системой метаобъектов Qt.

Например:

#include <QObject>

class Counter : public QObject
{
    Q_OBJECT

public:
    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:
    void setValue(int value);

signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

Примечание: Этот макрос требует, чтобы класс был подклассом QObject. Используйте Q_GADGET вместо Q_OBJECT для активации поддержки системы метаобъектов для перечислений в классе, который не является подклассом QObject.

См. также Система метаобъектов, Сигналы и слоты и Система свойств Qt.

Q_PROPERTY(...)

Этот макрос используется для объявления свойств в классах, которые наследуют от QObject. Свойства ведут себя как члены данных класса, но имеют дополнительные возможности, доступные через систему метаобъектов.

Q_PROPERTY(type name
           (READ getFunction [WRITE setFunction] |
            MEMBER memberName [(READ getFunction | WRITE setFunction)])
           [RESET resetFunction]
           [NOTIFY notifySignal]
           [REVISION int | REVISION(int[, int])]
           [DESIGNABLE bool]
           [SCRIPTABLE bool]
           [STORED bool]
           [USER bool]
           [BINDABLE bindableProperty]
           [CONSTANT]
           [FINAL]
           [REQUIRED])

Имя свойства, тип и функция READ являются обязательными. Тип может быть любым типом, поддерживаемым QVariant, или это может быть пользовательский тип. Другие элементы являются необязательными, но функция WRITE является распространенной. Атрибуты по умолчанию установлены в true, за исключением USER, которое по умолчанию имеет значение false.

Например:

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

Для получения более подробной информации о том, как использовать этот макрос, и более подробного примера его использования, см. обсуждение на странице системы свойств Qt.

См. также Система свойств Qt.

Q_REVISION

Примените этот макрос к объявлениям функций-членов, чтобы пометить их номером ревизии в системе метаобъектов. Макрос записывается перед типом возвращаемого значения, как показано в следующем примере:

class Window : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int normalProperty READ normalProperty)
    Q_PROPERTY(int newProperty READ newProperty REVISION(2, 1))

public:
    Window();
    int normalProperty();
    int newProperty();
public slots:
    void normalMethod();
    Q_REVISION(2, 1) void newMethod();
};

Это полезно, когда вы используете систему метаобъектов для динамического экспонирования объектов другому API, так как вы можете сопоставить ожидаемую версию с несколькими версиями другого API. Рассмотрим следующий упрощённый пример:

    Window window;
    int expectedRevision = 0;
    const QMetaObject *windowMetaObject = window.metaObject();
    for (int i=0; i < windowMetaObject->methodCount(); i++)
        if (windowMetaObject->method(i).revision() <= expectedRevision)
            exposeMethod(windowMetaObject->method(i));
    for (int i=0; i < windowMetaObject->propertyCount(); i++)
        if (windowMetaObject->property(i).revision() <= expectedRevision)
            exposeProperty(windowMetaObject->property(i));

Используя тот же класс Window, что и в предыдущем примере, newProperty и newMethod будут экспонированы в этом коде только при ожидаемой версии 2.1 или выше.

Поскольку все методы считаются в ревизии 0 при отсутствии метки, метка Q_REVISION(0) или Q_REVISION(0, 0) считается недействительной и игнорируется.

Вы можете передать один или два целых параметра в Q_REVISION. Если вы передаёте один параметр, он обозначает только второстепенную версию. Это означает, что основная версия не указана. Если вы передаёте два, первый параметр — основная версия, а второй — второстепенная версия.

Эта метка не используется самой системой метаобъектов. В настоящее время она используется только модулем QtQml.

Для более универсальной строковой метки см. QMetaMethod::tag()

См. также QMetaMethod::revision().

[since 5.0] Q_SET_OBJECT_NAME(Object)

Этот макрос присваивает Object имя объекта "Object".

Не имеет значения, является ли Object указателем или нет, макрос это определяет сам.

Данная функция была введена в Qt 5.0.

См. также QObject::objectName().

Q_SIGNAL

Это дополнительный макрос, который позволяет пометить отдельную функцию как сигнал. Он может быть очень полезен, особенно при использовании парсера кода стороннего разработчика, который не понимает группы signals или Q_SIGNALS.

Используйте этот макрос для замены ключевого слова signals в объявлениях классов, если вы хотите использовать Qt Сигналы и Слоты с механизмом сигнала/слота стороннего разработчика .

Макрос обычно используется, когда no_keywords указан с переменной CONFIG в файле .pro, но он может быть использован и когда no_keywords не указан.

Q_SIGNALS

Используйте этот макрос для замены ключевого слова signals в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слоты с механизмом сигнала/слота стороннего разработчика .

Макрос обычно используется, когда no_keywords указан с переменной CONFIG в файле .pro, но он может быть использован и когда no_keywords не указан.

Q_SLOT

Это дополнительный макрос, который позволяет пометить отдельную функцию как слот. Он может быть очень полезен, особенно при использовании парсера кода стороннего разработчика, который не понимает группы slots или Q_SLOTS.

Используйте этот макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слоты с механизмом сигнала/слота стороннего разработчика .

Макрос обычно используется, когда no_keywords указан с переменной CONFIG в файле .pro, но он может быть использован и когда no_keywords не указан.

Q_SLOTS

Используйте этот макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слоты с механизмом сигнала/слота стороннего разработчика .

Макрос обычно используется, когда no_keywords указан с переменной CONFIG в файле .pro, но он может быть использован и когда no_keywords не указан.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qobject.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API