Spec-Zone.ru › Qt 5.11

Класс QObject

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

Заголовок: #include <QObject>
qmake: QT += core
Наследуется от:

QAbstractAnimation, QAbstractEventDispatcher, QAbstractItemModel, QAbstractState, QAbstractTransition, QCoreApplication, QEventLoop, QFileSelector, QFileSystemWatcher, QIODevice, QItemSelectionModel, QLibrary, QMimeData, QObjectCleanupHandler, QPluginLoader, QSettings, QSharedMemory, QSignalMapper, QSocketNotifier, QThread, QThreadPool, QTimeLine, QTimer, QTranslator и 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)

Свойства

  • 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 QRegExp &regExp, 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 = Q_OBJECT, int n = Q_OBJECT)

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

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)

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

typedef QObjectList
QList<T> qFindChildren(const QObject *obj, const QRegExp &regExp)
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_EMIT
Q_ENUM( ...)
Q_ENUM_NS( ...)
Q_FLAG( ...)
Q_FLAG_NS( ...)
Q_GADGET
Q_INTERFACES( ...)
Q_INVOKABLE
Q_NAMESPACE
Q_OBJECT
Q_PROPERTY( ...)
Q_REVISION
Q_SET_OBJECT_NAME(Object)
Q_SIGNAL
Q_SIGNALS
Q_SLOT
Q_SLOTS

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

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

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

QObjects организуются в дереве объектов. Когда вы создаёте 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 см. в разделе «Использование файла интерфейса Qt 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().

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

QObject::QObject(QObject *parent = nullptr)

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

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

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

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

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

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

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

См. также 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)

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

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

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

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

Функция была добавлена в Qt 4.8.

См. также 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] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

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

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

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

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

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

[slot] void QObject::deleteLater()

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

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

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

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

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

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

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

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

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

[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, 0, 0, 0);

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

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

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

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

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

    myObject->disconnect(myReceiver);

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

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

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

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

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

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

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

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

Отключает signal в объекте sender от method в объекте receiver. Возвращает true если подключение успешно разорвано; в противном случае возвращает disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method).

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

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

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

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

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

См. также 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.

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

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

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] bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. connectNotify() для примера сравнения signal со специфическим сигналом.

Если все сигналы были отсоединены от этого объекта (например, аргумент сигнала в disconnect() был равен 0), 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().

Этот метод был представлен в Qt 4.2.

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

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

Метод event() можно переопределить, чтобы настроить поведение объекта.

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

Пример:

class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = 0);
    ~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() для своих внутренних целей.

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

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

T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

Возвращает дочерний элемент этого объекта, который можно привести к типу T и который называется name, или 0, если такого объекта нет. Опуская аргумент 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().

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

QList<T> QObject::findChildren(const QRegExp &regExp, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

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

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

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] 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 равен нулю, вся обработка событий для этого объекта и его дочерних элементов останавливается.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[protected] int QObject::senderSignalIndex() const

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

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

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

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

Функция была добавлена в Qt 4.8.

См. также 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 = 0);

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

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 = 0);

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 = Q_OBJECT, int n = Q_OBJECT)

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

Пример:

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

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

Пример:

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

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

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

END_OF_DOCUMENT_MARKER

См. также 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().

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

T qobject_cast(QObject *object)

T qobject_cast(const QObject *object)

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

Класс 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 == 0

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

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

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

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

typedef QObjectList

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

QList<T> qFindChildren(const QObject *obj, const QRegExp &regExp)

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

Эта функция эквивалентна obj->findChildren<T>(regExp).

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

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

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

QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

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

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

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

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

Этот макрос связывает дополнительную информацию с классом, которая доступна с помощью QObject::metaObject(). Qt использует эту функцию только в ограниченной степени, в Active 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(), QAxFactory, Использование адаптеров 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 &);
     MyClass &operator=(const MyClass &);
};

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

  QWidget w = QWidget();

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

Q_EMIT

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

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

Q_ENUM( ...)

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

Например:

class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass(QObject *parent = 0);
    ~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 выведет их имена.

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

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

Q_ENUM_NS( ...)

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

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

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

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

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

Q_FLAG( ...)

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

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

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

class QLibrary : public QObject
{
    Q_OBJECT

public:
    ...

    enum LoadHint {
        ResolveAllSymbolsHint = 0x01,
        ExportExternalSymbolsHint = 0x02,
        LoadArchiveMemberHint = 0x04
    };
    Q_DECLARE_FLAGS(LoadHints, LoadHint)
    Q_FLAG(LoadHints)
    ...
}

Сами объявления флагов выполняются в общедоступной секции класса QLibrary с помощью макроса Q_DECLARE_FLAGS().

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

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

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

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

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.

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

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]
           [DESIGNABLE bool]
           [SCRIPTABLE bool]
           [STORED bool]
           [USER bool]
           [CONSTANT]
           [FINAL])

Имя свойства, тип и функция 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 1)

public:
    Window();
    int normalProperty();
    int newProperty();
public slots:
    void normalMethod();
    Q_REVISION(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 будут экспортированы только в этом коде, когда ожидаемая версия равна 1 или выше.

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

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

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

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

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/archives/qt-5.11/qobject.html

Spec-Zone.ru

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