Spec-Zone.ru › Qt

Класс QObject

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

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

Q3DОбъект, Q3DSцена, Q3DТема, QАбстрактная3DAxis, QАбстрактный3DОбработчикВвода, QАбстрактная3DСерия, QАбстрактнаяАнимация, QАбстрактнаяОсь, QАбстрактныйПроксиДанных, QАбстрактныйДиспечерСобытий, QАбстрактныйДелегатЭлемента, QАбстрактнаяМодельЭлементов, QАбстрактныйТестировщикМоделиЭлементов, QАбстрактныйКэшСети, QАбстрактныйOAuth, QАбстрактныйОбработчикОтветаOAuth, QАбстрактнаяСерия, QАбстрактноеСостояние, QАбстрактныйМакетДокументаТекста, QАбстрактныйПереход, QДоступныйПлагин, QДействие, QГруппаДействий, QДекодерАудио, QВводАудио, QВыводАудио, QАудиоПриёмник, QИсточникАудио, QAxБазовыйОбъект, QAxФабрика, QAxСкрипт, QAxМенеджерСкриптов, QНаборСтолбцов, QАгентОбнаруженияУстройствBluetooth, QЛокальноеУстройствоBluetooth, QСерверBluetooth, QАгентОбнаруженияУслугBluetooth, QНаборОбъектов, QГруппаКнопок, QКамера, QCanBus, QУстройствоCanBus, QCandlestickМодельМаппер, QCandlestickНабор, QБуферОбмена, QCoapКлиент, QАвтодополнение, QОсновноеПриложение, QПользовательский3DЭлемент, QМапперЭлементовДанных, QDBusАбстрактныйАдаптер, QDBusАбстрактныйИнтерфейс, QDBusОжиданиеВызоваНаблюдатель, QDBusСервер, QDBusСервисНаблюдатель, QDBusВиртуальныйОбъект, QИнтерфейсРедактораФормыДизайнера, QИнтерфейсМенеджераОконФормыДизайнера, QDnsПоиск, QПеретаскивание, QDtls, QDtlsКлиентПроверяющий, QЦиклОбработкиСобытий, QФабрикаРасширений, QМенеджерРасширений, QВыборФайла, QНаблюдательСистемыФайлов, QНаблюдательБудущего, QГенеральныйПлагин, QИсточникМониторингаОбластиGeo, QИсточникДанныхОПозицииGeo, QИсточникДанныхОСпутникахGeo, QЖест, QГрафическийЯкор, QГрафическийЭффект, QАнимацияЭлементаГрафики, QГрафическийОбъект, QГрафическаяСцена, QГрафическоеПреобразование, QЯдроДвигателяСправки, QДвигательФильтрацииСправки, QДвигательПоискаСправки, QHttpЧасть, QПлагинДвигателяИконок, QЗахватИзображения, QПлагинИзображенийIO, QUстройствоВвода, QМетодВвода, QУстройствоВвода-Вывода, QМодельВыбораЭлементов, QJSEngine, QМакет, QМаркерЛегенды, QБиблиотека, QЛокальныйСервер, QКонтроллерНизкогоПотребленияЭнергии, QУслугаНизкогоПотребленияЭнергии, QГенераторМасок, QСессияЗахватаМультимедиа, QУстройстваМультимедиа, QПроигрывательМультимедиа, QЗаписьМультимедиа, QДанныеMIME, QУстройствоModbus, QОтветModbus, QАнимация, QMqttКлиент, QMqttПодписка, QМенеджерБлижнегоПоля, QЦелеваяТочкаБлижнегоПоля, QМенеджерДоступаКСети, QХранилищеCookiesСети, QИнформацияОСети, QObjectОбработчикОчистки, QПоверхностьВнеЭкрана, QOpcUaКлиент, QOpcUaGdsКлиент, QOpcUaПараКлючей, QOpcUaУзел, QOpcUaПоставщик, QOpenGLКонтекст, QOpenGLГруппаКонтекстов, QOpenGLЛоггерОтладки, QOpenGLShader, QOpenGLПрограммаShader, QOpenGLМониторВремя, QOpenGLЗапросТаймера, QOpenGLОбъектМассиваВершин, QPdfПисатель, QСрезПирогов, QПлатформенныйДекодерАудио, QПлатформенныйПриёмникАудио, QПлатформенныйИсточникАудио, QПлатформеннаяКамера, QПлатформенныйЗахватИзображения, QЗагрузчикПлагинов, QQmlКомпонент, QQmlКонтекст, QQmlРасширениеДвигателя, QQmlВыражение, QQmlВыборФайла, QQmlБазовыйПоставщикИзображений, QQmlКартаСвойств, QQuick3DОбъект, QQuickОтветИзображения, QQuickЭлемент, QQuickРезультатЗахватаЭлемента, QQuickУправлениеОтображением, QQuickДокументТекста, QQuickФабрикаТекстур, QQuickWebEngineПрофиль, QУдаленныйОбъектАбстрактноеХранилище, QУдаленныйОбъектУзел, QУдаленныйОбъектОжиданиеВызоваНаблюдатель, QУдаленныйОбъектРеплика, QЭкран, QПрокручиватель, QScxmlМодельДанных, QScxmlВызываемаяУслуга, QScxmlФабрикаВызываемойУслуги, QScxmlМашинаСостояний, QДатчик, QФонДатчика, QЧтениеДатчика, QМенеджерСеансов, QНастройки, QSGТекстура, QSGПоставщикТекстур, QОбщаяПамять, QСокращение, QМапперСигналов, QНаблюдательСигналов, QНаблюдательСокета, QЗвуковойЭффект, QSqlДрайвер, QSqlДрайверПлагин, QСтиль, QПодсказкиСтили, QПлагинСтили, QSvgРендерер, QВысокийСтилистСинтаксиса, QИконкаПанельСистемы, Qt3DАнимация::QАбстрактнаяАнимация, Qt3DАнимация::QКонтроллерАнимации, Qt3DАнимация::QГруппаАнимации, Qt3DАнимация::QЦелеваяМорфология, Qt3DCore::QАбстрактныйАспект, Qt3DCore::QДвигательАспектов, Qt3DCore::QУзел, Qt3DCore::Quick::QQmlДвигательАспектов, Qt3DInput::QИнтеграцияУстройстваВвода, Qt3DInput::QСобытиеКлавиши, Qt3DInput::QСобытиеМыши, Qt3DInput::QСобытиеКолеса, Qt3DRender::QГрафическийФильтрAPI, Qt3DRender::QСобытиеВыбора, Qt3DRender::QВозможностиРендеринга, Qt3DRender::QОтветЗахватаРендеринга, Qt3DRender::QАргументыОперацииСхемы, Qt3DRender::QАргументыТестаСхемы, Qt3DRender::QРежимОбертыванияТекстуры, QTcpСервер, QДокументТекста, QОбъектТекста, QПоток, QПулПотоков, QВременнаяЛиния, QТаймер, QПереводчик, QUiЗагрузчик, QUndoГруппа, QUndoСтек, QВалюдатор, QФорматировщикОси3DЗначений, QПриёмникВидео, QВиртуальнаяКлавиатураАбстрактныйМетодВвода, QВиртуальнаяКлавиатураСловарь, QМенеджерСловариВиртуальнойКлавиатуры, QРасширениеВиртуальнойКлавиатуры, QВиртуальнаяКлавиатураКонтекстВвода, QВиртуальнаяКлавиатураДвигательВвода, QНаблюдательВиртуальнойКлавиатуры, QВиртуальнаяКлавиатураТрассировка, QWaylandКлиент, QWaylandQuickИнтеграцияОболочки, QWaylandЗахватПоверхности, QWaylandПросмотр, QWaylandXdgПоп-ап, QWaylandXdgОсновноеОкно, QWebКанал, QWebКаналАбстрактныйТранспорт, QWebEngineЗапросКонтекстногоМеню, QWebEngineХранилищеCookies,

QWebEngineЗапросЗагрузки, QWebEngineИстория, QWebEngineЗапросНавигации, QWebEngineЗапросНовогоОкна, QWebEngineУведомление, QWebEngineСтраница, QWebEngineПрофиль, QWebEngineИнтерцепторЗапросовURL, QWebEngineЗадачаЗапросаURL, QWebEngineОбработчикСхемыURL, QWebSocket, QWebSocketСервер, QWidget, QWindow, и QWinEventУведомляющий

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

Примечание: Все функции в этом классе являются повторно входящими.

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

  • connect()
  • connect()
  • connect()
  • connect()
  • connect()
  • disconnect()
  • disconnect()
  • disconnect()
  • deleteLater()

Свойства

  • objectName : QString

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

QObject(QObject *parent = nullptr)
virtual~QObject()
boolblockSignals(bool block)
const QObjectList &children() const
QMetaObject::Connectionconnect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
booldisconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
booldisconnect(const QObject *receiver, const char *method = nullptr) const
voiddumpObjectInfo() const
voiddumpObjectTree() const
QList<QByteArray>dynamicPropertyNames() const
virtual boolevent(QEvent *e)
virtual booleventFilter(QObject *watched, QEvent *event)
TfindChild(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
boolinherits(const char *className) const
voidinstallEventFilter(QObject *filterObj)
boolisWidgetType() const
boolisWindowType() const
voidkillTimer(int id)
virtual const QMetaObject *metaObject() const
voidmoveToThread(QThread *targetThread)
QStringobjectName() const
QObject *parent() const
QVariantproperty(const char *name) const
voidremoveEventFilter(QObject *obj)
voidsetObjectName(const QString &name)
voidsetParent(QObject *parent)
boolsetProperty(const char *name, const QVariant &value)
boolsignalsBlocked() const
intstartTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
intstartTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)
QThread *thread() const

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

voiddeleteLater()

Сигналы

voiddestroyed(QObject *obj = nullptr)
voidobjectNameChanged(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)

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

virtual void childEvent(QChildEvent *event)
virtual void connectNotify(const QMetaMethod &signal)
virtual void customEvent(QEvent *event)
virtual void disconnectNotify(const QMetaMethod &signal)
bool isSignalConnected(const QMetaMethod &signal) const
int receivers(const char *signal) const
QObject * sender() const
int senderSignalIndex() const
virtual 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_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 с другим объектом в качестве родителя, объект автоматически добавляется в список children() родителя. Родитель принимает на себя ответственность за объект; т.е. он автоматически удалит своих детей в своем деструкторе. Вы можете искать объект по имени и (необязательно) типу, используя findChild() или findChildren().

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

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

QObjects могут получать события через 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 Объектная модель.

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

Автоматическое соединение

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

uic генерирует код, который вызывает эту функцию, чтобы включить автоматическое подключение между виджетами на формах, созданных с помощью Qt Designer. Более подробная информация об использовании автоматического подключения с Qt Designer приведена в разделе Использование файла пользовательского интерфейса 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() и Деревья объектов и владение.

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

[bindable] ИмяОбъекта : QString

Примечание: Это свойство поддерживает привязки QProperty.

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

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

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

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

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

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

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

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

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

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

Установка 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 отправляются виджетам, когда дочерние элементы отполированы или когда отполированные дочерние элементы добавлены. Если вы получаете событие child polished, конструирование дочернего элемента обычно завершено. Однако это не гарантируется, и несколько событий polish могут быть доставлены во время выполнения конструктора виджета.

Для каждого дочернего виджета вы получаете одно событие 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)

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

При указании signal и method необходимо использовать макросы 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 не может проверить существование signal или method или если их подписи несовместимы. Вы можете проверить, является ли дескриптор действительным, преобразовав его в bool.

По умолчанию сигнал испускается для каждого подключения; два сигнала испускаются для дублирующихся подключений. Все эти подключения можно разорвать с помощью одного вызова disconnect(). Если вы передадите тип Qt::UniqueConnection, подключение будет создано только в том случае, если оно не является дубликатом. Если уже существует дубликат (абсолютно тот же сигнал к абсолютно тому же слоту на тех же объектах), подключение не будет создано, и 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)

Создаёт подключение заданного типа type от сигнала signal в объекте sender к методу method в объекте 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().

Подключает signal от объекта sender к методу method этого объекта.

Эквивалентно 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().

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

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

Пример:

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

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

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

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

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

По умолчанию сигнал испускается для каждого подключения, которое вы создаете; два сигнала испускаются для дублируемых подключений. Вы можете разорвать все эти подключения одним вызовом disconnect(). Если вы передадите Qt::UniqueConnection тип, подключение будет создано только в том случае, если оно не является дубликатом. Если уже существует дубликат (тот же самый сигнал к тому же самому слоту на тех же самых объектах), подключение не удастся, и 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.

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

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

[static] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

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

Создает подключение от сигнала в объекте 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] template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)

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

Создает подключение заданного типа от сигнала в объекте 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)

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

Если вы хотите сравнить сигнал со специфическим сигналом, вы можете использовать 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)

Отключает сигнал в объекте sender от метода в объекте 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)

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

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

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

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

QMetaMethod() может использоваться как подстановочный символ, обозначающий «любой сигнал» или «любой слот в принимающем объекте». Аналогично, nullptr может использоваться для receiver, обозначая «любой принимающий объект». В этом случае параметр method также должен быть 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)

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

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

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

[static] template <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().

template <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().

template <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] template <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() также может быть использована в сочетании с интерфейсами; см. пример Plug & Paint для подробностей.

Предупреждение: Если 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.

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

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

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

См. также Q_DISABLE_COPY.

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")

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

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

[since 5.8] Q_NAMESPACE

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

Пространства имен Q_NAMESPACE могут содержать 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 имя объекта objectName "Object".

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

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

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

Q_SIGNAL

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

Используйте этот макрос для замены ключевого слова signals в объявлениях классов, когда вы хотите использовать сигналы и слоты Qt с механизмом сигналов/слотов стороннего разработчика (3rd-party signal/slot mechanism).

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

Q_SIGNALS

Используйте этот макрос для замены ключевого слова signals в объявлениях классов, когда вы хотите использовать сигналы и слоты Qt с механизмом сигналов/слотов стороннего разработчика (3rd-party signal/slot mechanism).

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

Q_SLOT

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

Используйте этот макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать сигналы и слоты Qt с механизмом сигналов/слотов стороннего разработчика (3rd-party signal/slot mechanism).

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

Q_SLOTS

Используйте этот макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать сигналы и слоты Qt с механизмом сигналов/слотов стороннего разработчика (3rd-party signal/slot mechanism).

Макрос обычно используется, когда 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.2/qobject.html

Spec-Zone.ru

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