Класс QObject
Класс QObject является базовым классом всех объектов Qt. Подробнее...
Примечание: Все функции в этом классе являются перевключёнными.
Примечание: Эти функции также являются безопасными для потоков:
- connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
- connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
- connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
- connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
- disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
- disconnect(const char *signal, const QObject *receiver, const char *method) const
- disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
- deleteLater()
Свойства
- objectName : QString
Общедоступные функции
| QObject(QObject *parent = nullptr) | |
| virtual | ~QObject() |
| bool | blockSignals(bool block) |
| const QObjectList & | children() const |
| QMetaObject::Connection | connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const |
| bool | disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const |
| bool | disconnect(const QObject *receiver, const char *method = nullptr) const |
| void | dumpObjectInfo() const |
| void | dumpObjectTree() const |
| QList<QByteArray> | dynamicPropertyNames() const |
| virtual bool | event(QEvent *e) |
| virtual bool | eventFilter(QObject *watched, QEvent *event) |
| T | findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| QList<T> | findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| QList<T> | findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
| bool | inherits(const char *className) const |
| void | installEventFilter(QObject *filterObj) |
| bool | isWidgetType() const |
| bool | isWindowType() const |
| void | killTimer(int id) |
| virtual const QMetaObject * | metaObject() const |
| void | moveToThread(QThread *targetThread) |
| QString | objectName() const |
| QObject * | parent() const |
| QVariant | property(const char *name) const |
| void | removeEventFilter(QObject *obj) |
| void | setObjectName(const QString &name) |
| void | setParent(QObject *parent) |
| bool | setProperty(const char *name, const QVariant &value) |
| bool | signalsBlocked() const |
| int | startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer) |
| int | startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer) |
| QThread * | thread() const |
Public Slots
| void | deleteLater() |
Signals
| void | destroyed(QObject *obj = nullptr) |
| void | objectNameChanged(const QString &objectName) |
Static Public Members
| 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) |
Protected Functions
| виртуальный void | childEvent(QChildEvent *event) |
| виртуальный void | connectNotify(const QMetaMethod &signal) |
| виртуальный void | customEvent(QEvent *event) |
| виртуальный void | disconnectNotify(const QMetaMethod &signal) |
| bool | isSignalConnected(const QMetaMethod &signal) const |
| int | receivers(const char *signal) const |
| QObject * | sender() const |
| int | senderSignalIndex() const |
| виртуальный void | timerEvent(QTimerEvent *event) |
Связанные нечлены
| typedef | QObjectList |
| QList<T> | qFindChildren(const QObject *obj, const QRegExp ®Exp) |
| T | qobject_cast(QObject *object) |
| T | qobject_cast(const QObject *object) |
Макросы
| QT_NO_NARROWING_CONVERSIONS_IN_CONNECT | |
| Q_CLASSINFO(Name, Value) | |
| Q_DISABLE_COPY(Class) | |
| Q_DISABLE_COPY_MOVE(Class) | |
| Q_DISABLE_MOVE(Class) | |
| Q_EMIT | |
| Q_ENUM(...) | |
| Q_ENUM_NS(...) | |
| Q_FLAG(...) | |
| Q_FLAG_NS(...) | |
| Q_GADGET | |
| Q_INTERFACES(...) | |
| Q_INVOKABLE | |
| Q_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() позволяют отслеживать подключения.
QObjects организуются в деревья объектов. Когда вы создаёте QObject с другим объектом в качестве родителя, объект автоматически добавляет себя в список children() родителя. Родитель принимает владение объектом; то есть, он автоматически удалит своих детей в своём деструкторе. Вы можете искать объект по имени и, необязательно, по типу, используя findChild() или findChildren().
Каждый объект имеет objectName() и его имя класса можно найти с помощью соответствующего metaObject() (см. QMetaObject::className()). Вы можете определить, наследует ли класс объекта другой класс в иерархии наследования QObject, используя функцию inherits().
Когда объект удаляется, он генерирует сигнал destroyed(). Вы можете перехватить этот сигнал, чтобы избежать висячих ссылок на QObjects.
QObjects могут получать события через event() и фильтровать события других объектов. Подробности см. в installEventFilter() и eventFilter(). Обработчик по умолчанию childEvent() может быть переопределен для перехвата событий детей.
И, наконец, QObject предоставляет базовую поддержку таймеров в Qt; см. QTimer для поддержки таймеров высокого уровня.
Обратите внимание, что макрос Q_OBJECT обязателен для любого объекта, который реализует сигналы, слоты или свойства. Вам также нужно запустить Meta Object Compiler для исходного файла. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject, независимо от того, используются ли в них сигналы, слоты и свойства, поскольку отсутствие этого может привести к тому, что некоторые функции будут проявлять странное поведение.
Все виджеты Qt наследуют QObject. Функция по умолчанию isWidgetType() возвращает, является ли объект на самом деле виджетом. Она намного быстрее, чем qobject_cast<QWidget *>(obj) или obj->inherits("QWidget").
Некоторые функции QObject, например, children(), возвращают QObjectList. QObjectList — это typedef для QList<QObject *>.
Аффинити потока
У QObject есть аффинити потока или он живёт в определенном потоке. Когда QObject получает очередной сигнал или событие, обработчик слота или события будет выполняться в потоке, в котором живёт объект.
Примечание: Если у QObject нет аффинити потока (то есть, если thread() возвращает ноль) или если он живёт в потоке, у которого нет запущенного цикла событий, то он не может получать очередные сигналы или события.
По умолчанию QObject живёт в потоке, в котором он был создан. Аффинити потока объекта можно запросить с помощью thread() и изменить с помощью moveToThread().
Все QObjects должны жить в том же потоке, что и их родитель. Следовательно:
- setParent() завершится с ошибкой, если два QObjects находятся в разных потоках.
- Когда QObject перемещается в другой поток, все его дети будут перемещены автоматически.
- moveToThread() завершится с ошибкой, если у QObject есть родитель.
- Если QObjects создаются внутри QThread::run(), они не могут стать детьми объекта QThread, потому что QThread не живёт в потоке, который вызывает QThread::run().
Примечание: переменные-члены QObject не автоматически становятся его детьми. Связь «родитель-ребёнок» должна быть установлена либо путём передачи указателя на ребёнка конструктору QObject, либо путём вызова setParent(). Без этого шага переменные-члены объекта останутся в старом потоке при вызове moveToThread().
Отсутствует конструктор копирования и оператор присваивания
QObject не имеет ни конструктора копирования, ни оператора присваивания. Это сделано по умолчанию. Фактически, они объявлены, но в разделе private с макросом Q_DISABLE_COPY(). На самом деле, все классы Qt, производные от QObject (прямые или косвенные), используют этот макрос для объявления конструктора копирования и оператора присваивания как закрытых. Объяснение этого решения можно найти в обсуждении Тождество против значения на странице модели объектов Qt Object Model.
Основным следствием является то, что вы должны использовать указатели на QObject (или на ваш подкласс QObject), где иначе вы могли бы использовать ваш подкласс QObject как значение. Например, без конструктора копирования вы не можете использовать подкласс QObject в качестве значения, хранимого в одном из контейнерных классов. Вы должны хранить указатели.
Автоподключение
Метаобъектная система Qt предоставляет механизм для автоматического подключения сигналов и слотов между подклассами QObject и их потомками. При условии, что объекты определены с подходящими именами объектов, и слоты следуют простому соглашению об именовании, это подключение может быть выполнено во время работы функцией QMetaObject::connectSlotsByName().
uic генерирует код, который вызывает эту функцию, чтобы включить автоматическое подключение между виджетами на формах, созданных с помощью Qt Designer. Более подробная информация об использовании автоподключения с Qt Designer приведена в разделе Использование файла UI Designer в вашем приложении руководства Qt Designer.
Динамические свойства
Начиная с Qt 4.2, динамические свойства можно добавлять к экземплярам QObject и удалять из них во время выполнения. Динамические свойства не нужно объявлять на этапе компиляции, но они предоставляют те же преимущества, что и статические свойства, и управляются с помощью того же API — используя property() для чтения и setProperty() для записи.
Начиная с Qt 4.3, динамические свойства поддерживаются Qt Designer, и стандартные виджеты Qt, а также созданные пользователем формы могут иметь динамические свойства.
Международная локализация (I18n)
Все подклассы QObject поддерживают функции локализации Qt, что позволяет переводить пользовательский интерфейс приложения на разные языки.
Чтобы сделать отображаемый пользователем текст переводимым, его необходимо заключить в вызовы функции tr(). Это подробно описано в документе Написание исходного кода для перевода.
См. также QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY() и Деревья объектов и владение.
Документация по свойствам
objectName : QString
Это свойство содержит имя этого объекта
Вы можете найти объект по имени (и типу) с помощью findChild(). Вы можете найти набор объектов с помощью findChildren().
qDebug("MyClass::setPrecision(): (%s) invalid precision %f",
qPrintable(objectName()), newPrecision); По умолчанию это свойство содержит пустую строку.
Функции доступа:
| QString | objectName() const |
| void | setObjectName(const QString &name) |
Сигнал уведомления:
| void | objectNameChanged(const QString &objectName) | [см. примечание ниже] |
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
См. также metaObject() и QMetaObject::className().
Документация по членам-функциям
QObject::QObject(QObject *parent = nullptr)
Создаёт объект с родительским объектом parent.
Родитель объекта можно рассматривать как владельца объекта. Например, диалоговое окно dialog box является родителем кнопок ОК и Отмена, которые оно содержит.
Деструктор родительского объекта уничтожает все дочерние объекты.
Установка 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.
[signal] void QObject::objectNameChanged(const QString &objectName)
Этот сигнал испускается после изменения имени объекта. Новое имя объекта передаётся как objectName.
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может быть испущен пользователем.
Примечание: Сигнал уведомления для свойства objectName.
См. также QObject::objectName.
[virtual] QObject::~QObject()
Уничтожает объект, удаляя все его дочерние объекты.
Все сигналы к и от объекта автоматически отключаются, а все ожидающие события, опубликованные для объекта, удаляются из очереди событий. Однако часто безопаснее использовать deleteLater(), чем удалять подкласс QObject напрямую.
Предупреждение: Все дочерние объекты удаляются. Если какие-либо из этих объектов находятся на стеке или в глобальной области, рано или поздно ваша программа аварийно завершит работу. Мы не рекомендуем хранить указатели на дочерние объекты извне родительского объекта. Если вы всё же это делаете, сигнал destroyed() даёт вам возможность обнаружить, когда объект уничтожается.
Предупреждение: Удаление QObject в то время, когда ожидаются события, может привести к аварийному завершению работы. Вы не должны удалять QObject напрямую, если он существует в другом потоке, чем тот, который в настоящее время выполняется. Используйте deleteLater() вместо этого, что заставит цикл событий удалить объект после того, как все ожидающие события будут доставлены ему.
См. также deleteLater().
bool QObject::blockSignals(bool block)
Если block равно true, сигналы, испускаемые этим объектом, блокируются (т.е. испускание сигнала не вызовет ничего, подключенного к нему). Если block равно false, такая блокировка не произойдёт.
Возвращаемое значение — предыдущее значение signalsBlocked().
Обратите внимание, что сигнал destroyed() будет испущен даже если сигналы для этого объекта были заблокированы.
Сигналы, испускаемые во время блокировки, не буферизуются.
См. также signalsBlocked() и QSignalBlocker.
[virtual protected] void QObject::childEvent(QChildEvent *event)
Этот обработчик событий может быть переопределён в подклассе для получения событий о дочерних объектах. Событие передаётся в параметре event.
События QEvent::ChildAdded и QEvent::ChildRemoved отправляются объектам, когда добавляются или удаляются дочерние объекты. В обоих случаях вы можете полагаться только на то, что дочерний объект является QObject, или, если isWidgetType() возвращает true, QWidget. (Это связано с тем, что в случае ChildAdded дочерний объект ещё не полностью создан, а в случае ChildRemoved он мог быть уже уничтожен).
События QEvent::ChildPolished отправляются виджетам, когда дочерние объекты полируются или добавляются полированные дочерние объекты. Если вы получаете событие полирования дочернего объекта, значит построение дочернего объекта обычно завершено. Однако это не гарантируется, и несколько событий полирования могут быть доставлены во время выполнения конструктора виджета.
Для каждого дочернего виджета вы получаете одно событие ChildAdded, ноль или более событий ChildPolished и одно событие ChildRemoved.
Событие ChildPolished пропускается, если дочерний элемент удаляется сразу после добавления. Если дочерний элемент полируется несколько раз во время создания и уничтожения, вы можете получить несколько событий о полировке одного и того же дочернего элемента, каждый раз с различной виртуальной таблицей.
См. также event().
const QObjectList &QObject::children() const
Возвращает список дочерних объектов. Класс QObjectList определен в заголовочном файле <QObject> следующим образом:
typedef QList<QObject*> QObjectList;
Первый добавленный дочерний элемент — это первый объект в списке, а последний добавленный — последний объект в списке, то есть новые дочерние элементы добавляются в конец.
Обратите внимание, что порядок списка изменяется, когда дочерние элементы QWidget поднимаются или опускаются. Виджет, который поднят, становится последним объектом в списке, а опущенный — первым объектом в списке.
См. также findChild(), findChildren(), parent() и setParent().
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
Создает подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.
При указании сигнала и метода необходимо использовать макросы SIGNAL() и SLOT(), например:
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int))); Этот пример гарантирует, что метка всегда отображает текущее значение полосы прокрутки. Обратите внимание, что параметры сигнала и слота не должны содержать никаких имен переменных, только типы. Например, следующее не будет работать и вернёт false:
// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
label, SLOT(setNum(int value))); Сигнал также может быть подключен к другому сигналу:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget();
signals:
void buttonClicked();
private:
QPushButton *myButton;
};
MyWidget::MyWidget()
{
myButton = new QPushButton(this);
connect(myButton, SIGNAL(clicked()),
this, SIGNAL(buttonClicked()));
} В этом примере конструктор MyWidget перенаправляет сигнал из закрытой переменной-члена и делает его доступным под именем, связанным с MyWidget.
Сигнал может быть подключен к множеству слотов и сигналов. Многие сигналы могут быть подключены к одному слоту.
Если сигнал подключен к нескольким слотам, слоты активируются в том же порядке, в котором были созданы подключения, когда сигнал испускается.
Функция возвращает QMetaObject::Connection, представляющий дескриптор подключения, если подключение сигнала к слоту успешно выполнено. Дескриптор подключения будет недействительным, если подключение не может быть создано, например, если QObject не может проверить наличие либо сигнала, либо метода, или если их подписи несовместимы. Вы можете проверить, является ли дескриптор действительным, применив к нему приведение к типу bool.
По умолчанию сигнал испускается для каждого созданного подключения; для дублирующих подключений испускаются два сигнала. Вы можете разорвать все эти подключения с помощью одного вызова disconnect(). Если вы передадите Qt::UniqueConnection в качестве type, подключение будет создано только в случае, если оно не является дубликатом. Если уже существует дубликат (одинаковый сигнал для одного и того же слота в тех же объектах), подключение не будет создано, и connect вернёт недействительный QMetaObject::Connection.
Примечание: Qt::UniqueConnections не работают для лямбда-выражений, не являющихся методами, и для функторов; они применяются только к подключению к методам-членам.
Необязательный параметр type описывает тип подключения. В частности, он определяет, доставляется ли конкретный сигнал в слот немедленно или в очереди для доставки в более позднее время. Если сигнал помещается в очередь, параметры должны иметь типы, известные системе метаобъектов Qt, так как Qt должен скопировать аргументы для хранения их в событии внутри.
Если при использовании подключений в очереди вы получаете сообщение об ошибке
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных перед установлением подключения.
Примечание: Эта функция является потокобезопасной.
См. также disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE() и Различия между подключениями на основе строк и функторов.
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
Создает подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.
Дескриптор подключения будет недействительным, если подключение не может быть создано, например, в случае неверных параметров. Вы можете проверить, является ли QMetaObject::Connection действительным, применив к нему приведение к типу bool.
Эта функция работает так же, как connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type), но использует QMetaMethod для указания сигнала и метода.
Функция была добавлена в 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().
Создает подключение указанного типа от сигнала в объекте sender к методу в объекте receiver. Возвращает дескриптор подключения, который может быть использован для его последующего отключения.
Сигнал должен быть функцией, объявленной как сигнал в заголовке. Функция слота может быть любым членом функции, который может быть подключен к сигналу. Слоту может быть подключен данный сигнал, если у сигнала не меньше аргументов, чем у слота, и существует неявное преобразование между типами соответствующих аргументов в сигнале и слоте.
Пример:
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
label, &QLabel::setText); Этот пример гарантирует, что метка всегда отображает текущий текст поля редактирования.
Сигнал может быть подключен к множеству слотов и сигналов. Многие сигналы могут быть подключены к одному слоту.
Если сигнал подключен к нескольким слотам, слоты активируются в том же порядке, в котором они были подключены, когда сигнал испускается.
Функция возвращает дескриптор подключения, если подключение сигнала к слоту успешно выполнено. Дескриптор подключения будет недействительным, если QObject не может проверить существование signal (если он не объявлен как сигнал). Вы можете проверить, является ли 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.
[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Отключает signal в объекте sender от method в объекте receiver. Возвращает true если соединение успешно разорвано; в противном случае возвращает false.
Соединение сигнал-слот удаляется при уничтожении любого из участвующих объектов.
disconnect() обычно используется тремя способами, как показано в следующих примерах.
- Отключить всё подключенное к сигналам объекта:
disconnect(myObject, nullptr, nullptr, nullptr);
эквивалентно нестатической перегруженной функции
myObject->disconnect();
- Отключить всё подключенное к конкретному сигналу:
disconnect(myObject, SIGNAL(mySignal()), nullptr, nullptr);
эквивалентно нестатической перегруженной функции
myObject->disconnect(SIGNAL(mySignal()));
- Отключить конкретного получателя:
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 не указан, поэтому вы не можете отключить конкретный слот для всех объектов.
Примечание: Эта функция является потокобезопасной.
См. также connect().
[static] bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
Отключает signal в объекте sender от method в объекте receiver. Возвращает true если соединение успешно разорвано; в противном случае возвращает false.
Эта функция предоставляет те же возможности, что и disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method), но использует QMetaMethod для представления сигнала и метода, которые необходимо отключить.
Кроме того, эта функция возвращает false и не отключает никаких сигналов и слотов, если:
- signal не является членом класса sender или одного из его родительских классов.
- method не является членом класса receiver или одного из его родительских классов.
- экземпляр signal не представляет сигнал.
QMetaMethod() может использоваться в качестве символа подстановки в значении "любой сигнал" или "любой слот в принимающем объекте". Аналогичным образом nullptr может использоваться для receiver в значении "любой принимающий объект". В этом случае method также должен быть QMetaMethod(). Параметр sender никогда не должен быть nullptr.
Функция была представлена в 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() обычно используется тремя способами, как показано в следующих примерах.
- Отключить всё, подключенное к сигналам объекта:
disconnect(myObject, nullptr, nullptr, nullptr);
- Отключить всё, подключенное к определённому сигналу:
disconnect(myObject, &MyObject::mySignal(), nullptr, nullptr);
- Отключить конкретного получателя:
disconnect(myObject, nullptr, myReceiver, nullptr);
- Отключить подключение от одного конкретного сигнала к определённому слоту:
QObject::disconnect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);
nullptr может использоваться в качестве шаблона, означающего "любой сигнал", "любой принимающий объект" или "любой слот в принимающем объекте" соответственно.
Отправитель никогда не может быть nullptr. (Вы не можете отключить сигналы от более чем одного объекта в одном вызове.)
Если сигнал nullptr, он отключает получателя и метод от любого сигнала. В противном случае отключается только указанный сигнал.
Если получатель nullptr, он отключает всё, подключенное к сигналу. В противном случае слоты в объектах, отличных от получателя, не отключаются.
Если метод nullptr, он отключает всё, что подключено к получателю. В противном случае будут отключены только слоты с именем метод, а все остальные слоты останутся без изменений. Метод должен быть nullptr если получатель опущен, поэтому вы не можете отключить конкретный слот на всех объектах.
Примечание: Невозможно использовать этот перегруз для отключения сигналов, подключённых к функторам или лямбда-выражениям. Это связано с тем, что их нельзя сравнить. Вместо этого используйте перегруз, принимающий QMetaObject::Connection
Примечание: Эта функция безопасна для потоков.
См. также connect().
[virtual protected] void QObject::disconnectNotify(const QMetaMethod &signal)
Этот виртуальный метод вызывается, когда что-то было отключено от сигнала в этом объекте.
См. connectNotify() для примера того, как сравнить сигнал со специфическим сигналом.
Если все сигналы были отключены от этого объекта (например, аргумент сигнала в disconnect() был nullptr), disconnectNotify() вызывается только один раз, и сигнал станет недействительным 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 = 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.
В вашей переопределённой реализации, если вы хотите отфильтровать событие, т. е. остановить его дальнейшую обработку, верните 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().
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().
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 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 равен 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 из потока, отличного от потока объекта. Не используйте эту функцию в подобных сценариях.
Эта функция была добавлена в 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 = 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().
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().
Связанные нечлены
Возвращает заданный 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().
typedef QObjectList
QList<T> qFindChildren(const QObject *obj, const QRegExp ®Exp)
Данная функция перегружает qFindChildren().
Эта функция эквивалентна obj->findChildren<T>(regExp).
Примечание: Эта функция была предоставлена как обходной путь для MSVC 6, который не поддерживал функции-шаблоны членов. Рекомендуется использовать другую форму в новом коде.
См. также QObject::findChildren().
Документация макросов
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
Определение этого макроса отключит сужающие и преобразования с плавающей точки в целое между аргументами сигнала и аргументами слота, когда сигнал и слот соединены с помощью синтаксиса на основе PMF.
Эта функция была представлена в Qt 5.8.
См. также QObject::connect.
Q_CLASSINFO(Name, Value)
Этот макрос связывает дополнительную информацию с классом, которая доступна с помощью QObject::metaObject(). Qt использует эту функцию только в ограниченной мере, в Active Qt, Qt D-Bus и Qt QML.
Дополнительная информация представлена в виде строки Name и литеральной строки Value.
Пример:
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(Class)
Отключает использование копирующих конструкторов и операторов присваивания для данного класса Class.
Экземпляры подклассов QObject не должны рассматриваться как значения, которые можно копировать или присваивать, но как уникальные идентификаторы. Это означает, что при создании собственного подкласса QObject (директор или непрямой), вам не следует предоставлять ему копирующий конструктор или оператор присваивания. Однако этого может быть недостаточно, чтобы просто опустить их из вашего класса, потому что, если вы случайно напишете код, который требует копирующего конструктора или оператора присваивания (это легко сделать), ваш компилятор учтиво создаст его для вас. Вам нужно сделать больше.
Внимательный пользователь увидит, что классы Qt, производные от QObject, обычно включают этот макрос в частной секции:
class MyClass : public QObject
{
private:
Q_DISABLE_COPY(MyClass)
}; Он объявляет копирующий конструктор и оператор присваивания в частной секции, так что если вы их случайно используете, компилятор сообщит об ошибке.
class MyClass : public QObject
{
private:
MyClass(const MyClass &) = delete;
MyClass &operator=(const MyClass &) = delete;
}; Но даже этого может быть недостаточно, чтобы поймать абсолютно все случаи. Вы можете быть искушены сделать что-то вроде этого:
QWidget w = QWidget();
Во-первых, не делайте этого. Большинство компиляторов сгенерируют код, который использует копирующий конструктор, поэтому ошибка нарушения конфиденциальности будет сообщена, но ваш компилятор C++ не обязан генерировать код для этого оператора каким-либо определенным образом. Он может сгенерировать код, используя ни копирующий конструктор, ни оператор присваивания, которые мы сделали закрытыми. В этом случае ошибка не будет сообщена, но ваше приложение, вероятно, аварийно завершится при вызове члена функции w.
См. также Q_DISABLE_COPY_MOVE и Q_DISABLE_MOVE.
Q_DISABLE_COPY_MOVE(Class)
Удобный макрос, который отключает использование копирующих конструкторов, операторов присваивания, конструкторов перемещения и операторов присваивания перемещения для данного класса Class, объединяющий Q_DISABLE_COPY и Q_DISABLE_MOVE.
Эта функция была представлена в Qt 5.13.
См. также Q_DISABLE_COPY и Q_DISABLE_MOVE.
Q_DISABLE_MOVE(Class)
Отключает использование конструкторов перемещения и операторов присваивания перемещения для данного класса Class.
Эта функция была представлена в Qt 5.13.
См. также Q_DISABLE_COPY и Q_DISABLE_COPY_MOVE.
Q_EMIT
Используйте этот макрос для замены ключевого слова emit для передачи сигналов, когда вы хотите использовать Qt Сигналы и Слоты с механизмом сигналов/слотов сторонних разработчиков .
Макрос обычно используется, когда 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 = 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.
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.
Q_FLAG(...)
Этот макрос регистрирует один тип флагов со свойством flags в системе метаобъектов. Обычно он используется в определении класса для объявления того, что значения данного перечисления могут использоваться как флаги и объединяться с помощью оператора побитового ИЛИ. Для пространств имён используйте 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(LoadHint)
...
} Объявление самих флагов выполняется в общедоступной секции класса QLibrary с использованием макроса Q_DECLARE_FLAGS().
Примечание: Макрос Q_FLAG позаботится о регистрации отдельных значений флагов в системе метаобъектов, поэтому нет необходимости использовать Q_ENUM() дополнительно к этому макросу.
Эта функция была представлена в Qt 5.5.
См. также Система свойств Qt.
Q_FLAG_NS(...)
Этот макрос регистрирует один тип флагов со свойством flags в системе метаобъектов. Он используется в пространстве имён, имеющем макрос 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++.
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.
Эта функция была добавлена в Qt 5.8.
См. также Q_NAMESPACE_EXPORT.
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
Макрос Q_NAMESPACE_EXPORT можно использовать для добавления возможностей QMetaObject в пространство имён.
Он работает точно так же, как макрос Q_NAMESPACE. Однако внешняя переменная staticMetaObject в пространстве имён объявляется с предоставленным квалификатором 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]
[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, что и в предыдущем примере, новыеProperty и 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/qt-5.14/qobject.html