Класс 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)
- 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)
- disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
Свойства
- objectName : QString
Общедоступные функции
| QObject(QObject *parent = Q_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 = Q_NULLPTR, const QObject *receiver = Q_NULLPTR, const char *method = Q_NULLPTR) const |
| bool | disconnect(const QObject *receiver, const char *method = Q_NULLPTR) const |
| void | dumpObjectInfo() |
| void | dumpObjectTree() |
| 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 ®Exp, 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) |
| QThread * | thread() const |
Открытые слоты
| void | deleteLater() |
Сигналы
| void | destroyed(QObject *obj = Q_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_NULLPTR, int n = -1) |
Protected Functions
| 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) |
Related Non-Members
| typedef | QObjectList |
| QList<T> | qFindChildren(const QObject *obj, const QRegExp ®Exp) |
| T | qobject_cast(QObject *object) |
Macros
| Q_CLASSINFO(Name, Value) | |
| Q_DISABLE_COPY(Class) | |
| Q_EMIT | |
| Q_ENUM(...) | |
| Q_FLAG(...) | |
| Q_GADGET | |
| Q_INTERFACES(...) | |
| Q_INVOKABLE | |
| 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 обязателен для любого объекта, который реализует сигналы, слоты или свойства. Вам также необходимо запустить Meta Object Compiler на исходном файле. Мы настоятельно рекомендуем использовать этот макрос во всех подклассах QObject, независимо от того, используют ли они сигналы, слоты и свойства на самом деле, так как пропуск его может привести к тому, что некоторые функции будут вести себя странным образом.
Все виджеты Qt наследуют QObject. Удобная функция isWidgetType() возвращает значение true, если объект является виджетом. Она гораздо быстрее, чем qobject_cast<QWidget *>(obj) или obj->inherits("QWidget").
END_OF_DOCUMENT_MARKERНекоторые функции QObject, например, children(), возвращают QObjectList. QObjectList — это псевдоним для QList<QObject *>.
Связь с потоком
Объект QObject обладает связью с потоком или находится в определённом потоке. Когда QObject получает помещённый в очередь сигнал или помещённое событие, обработчик сигнала или события будет выполнен в потоке, в котором находится объект.
Примечание: Если QObject не имеет связи с потоком (то есть, если thread() возвращает ноль) или если он находится в потоке, в котором нет работающего цикла событий, то он не может получать помещённые в очередь сигналы или помещённые события.
По умолчанию, QObject находится в потоке, в котором он был создан. Связь объекта с потоком можно запросить с помощью thread() и изменить с помощью moveToThread().
Все QObjects должны находиться в одном потоке со своим родителем. Вследствие этого:
- setParent() завершится неудачно, если два QObjects находятся в разных потоках.
- Когда QObject перемещается в другой поток, все его дочерние объекты также будут автоматически перемещены.
- moveToThread() завершится неудачно, если QObject имеет родителя.
- Если QObjects созданы в QThread::run(), они не могут стать дочерними объектами объекта QThread, поскольку QThread не находится в потоке, который вызывает QThread::run().
Примечание: Переменные-члены QObject не автоматически становятся его дочерними объектами. Отношение родитель-дочерний объект должно быть установлено, либо передав указатель на дочерний объект в конструктор, либо вызвав setParent(). Без этого шага, переменные-члены объекта останутся в старом потоке при вызове moveToThread().
Отсутствует конструктор копирования или оператор присваивания
QObject не имеет ни конструктора копирования, ни оператора присваивания. Это сделано по умолчанию. На самом деле, они объявлены, но в секции private, с макросом Q_DISABLE_COPY(). Фактически, все классы Qt, производные от QObject (прямые или косвенные), используют этот макрос, чтобы сделать их конструктор копирования и оператор присваивания закрытыми. Обоснование этого можно найти в обсуждении Тождество против значения на странице модели объектов Qt Object Model.
Основным следствием этого является то, что вы должны использовать указатели на QObject (или на ваш подкласс QObject), где вы, возможно, захотели бы использовать подкласс QObject как значение. Например, без конструктора копирования вы не можете использовать подкласс QObject в качестве значения, хранимого в одном из контейнерных классов. Вы должны хранить указатели.
Автоматическое подключение
Система метаобъектов Qt предоставляет механизм для автоматического подключения сигналов и слотов между подклассами QObject и их дочерними объектами. До тех пор, пока объекты определены с подходящими именами объектов, и слоты следуют простому соглашению об именах, это подключение может быть выполнено во время выполнения функцией QMetaObject::connectSlotsByName().
uic генерирует код, который вызывает эту функцию, чтобы включить автоматическое подключение между виджетами на формах, созданных с помощью Qt Designer. Более подробная информация об использовании автоматического подключения с Qt Designer приведена в разделе Использование файла пользовательского интерфейса 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 = Q_NULLPTR)
Создаёт объект с родительским объектом parent.
Родитель объекта может рассматриваться как владелец объекта. Например, диалоговое окно является родителем кнопок ОК и Отмена, которые оно содержит.
Деструктор родительского объекта уничтожает все дочерние объекты.
Установка parent в 0 создаёт объект без родителя. Если объект является виджетом, он станет верхним окном.
См. также 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 отправляются виджетам, когда дочерние объекты полируются, или когда добавлены полированные дочерние объекты. Если вы получаете событие child polished, конструкция дочернего объекта обычно завершена. Однако это не гарантируется, и несколько событий polish могут быть доставлены во время выполнения конструктора виджета.
Для каждого дочернего виджета вы получаете одно событие ChildAdded, ноль или более событий ChildPolished и одно событие ChildRemoved.
Событие ChildPolished пропускается, если дочерний объект удаляется сразу после добавления. Если дочерний объект полируется несколько раз во время конструирования и разрушения, вы можете получить несколько событий child polished для того же дочернего объекта, каждый раз с другой виртуальной таблицей.
См. также event().
const QObjectList &QObject::children() const
Возвращает список дочерних объектов. Класс QObjectList определен в файле заголовков <QObject> следующим образом:
typedef QList<QObject*> QObjectList;
Первый добавленный дочерний объект является первым объектом в списке, а последний добавленный — последним объектом в списке, т. е. новые дочерние объекты добавляются в конец.
Обратите внимание, что порядок списка изменяется, когда дочерние объекты QWidget поднимаются или опускаются. Объект виджета, который был поднят, становится последним объектом в списке, а объект виджета, который был опущен, становится первым объектом в списке.
См. также findChild(), findChildren(), parent() и setParent().
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
Создаёт соединение заданного type от signal в объекте sender к method в объекте receiver. Возвращает дескриптор соединения, который может быть использован для его последующего разрыва.
При указании signal и method необходимо использовать макросы SIGNAL() и SLOT(), например:
QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int))); Этот пример гарантирует, что метка всегда отображает текущее значение полосы прокрутки. Обратите внимание, что параметры сигнала и слота не должны содержать имён переменных, только тип. Например, следующее не будет работать и вернёт false:
// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
label, SLOT(setNum(int value))); Сигнал также может быть подключён к другому сигналу:
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget();
signals:
void buttonClicked();
private:
QPushButton *myButton;
};
MyWidget::MyWidget()
{
myButton = new QPushButton(this);
connect(myButton, SIGNAL(clicked()),
this, SIGNAL(buttonClicked()));
} В этом примере конструктор MyWidget пересылает сигнал из приватной переменной-члена и делает его доступным под именем, связанным с MyWidget.
Сигнал может быть подключён к множеству слотов и сигналов. Множество сигналов может быть подключено к одному слоту.
Если сигнал подключён к нескольким слотам, слоты активируются в том же порядке, в котором были установлены соединения, когда сигнал испускается.
Функция возвращает QMetaObject::Connection, представляющую дескриптор соединения, если соединение сигнала и слота успешно установлено. Дескриптор соединения будет недействительным, если соединение создать невозможно, например, если QObject не может проверить существование signal или method, или если их сигнатуры несовместимы. Можно проверить, является ли дескриптор действительным, приведён его к типу bool.
По умолчанию, для каждого установленного соединения испускается сигнал; для дублирующих соединений испускаются два сигнала. Все эти соединения можно разорвать с помощью одного вызова disconnect(). Если передать Qt::UniqueConnection в качестве type, соединение будет установлено только в случае, если оно не является дубликатом. Если уже существует дубликат (тот же самый сигнал к тому же самому слоту для тех же самых объектов), соединение будет неудачным, и connect вернёт недействительный QMetaObject::Connection.
Необязательный параметр type описывает тип соединения, которое должно быть установлено. В частности, он определяет, будет ли конкретный сигнал доставлен в слот немедленно или будет помещён в очередь для доставки позже. Если сигнал помещается в очередь, параметры должны быть типов, известные мета-объектной системе Qt, так как Qt необходимо скопировать аргументы для их хранения в событии за кулисами. Если при использовании очереди соединения вы получаете сообщение об ошибке
QObject::connect: Cannot queue arguments of type 'MyType' (Make sure 'MyType' is registered using qRegisterMetaType().)
вызовите qRegisterMetaType(), чтобы зарегистрировать тип данных перед установкой соединения.
Примечание: Эта функция потокобезопасна.
См. также disconnect(), sender(), qRegisterMetaType() и Q_DECLARE_METATYPE().
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
Создаёт соединение заданного type от signal в объекте sender к method в объекте receiver. Возвращает дескриптор соединения, который может быть использован для его последующего разрыва.
Дескриптор соединения будет недействительным, если соединение создать невозможно, например, если параметры были неверны. Можно проверить, является ли QMetaObject::Connection действительным, приведён его к типу bool.
Эта функция работает так же, как connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type), но использует QMetaMethod для указания сигнала и метода.
Эта функция была введена в 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().
Создаёт соединение заданного type от signal в объекте sender к method в объекте 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
Примечание: Количество аргументов в сигнале или слоте ограничено 6, если компилятор не поддерживает C++11 variadic templates.
Примечание: Эта функция потокобезопасна.
[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);
Если ваш компилятор поддерживает лямбда-выражения C++11, вы можете использовать их:
QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
socket->write("GET " + page + "\r\n");
}); Подключение будет автоматически отключено, если отправитель будет уничтожен. Однако вы должны позаботиться о том, чтобы любые объекты, используемые внутри функтора, оставались живыми, когда сигнал отправляется.
Примечание: Если компилятор не поддерживает вариадные шаблоны C++11, количество аргументов в сигнале или слоте ограничено 6, а объект функтора не должен иметь перегруженный или шаблонный оператор ().
Примечание: Эта функция является потокобезопасной.
[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, и возвращает дескриптор подключения.
Сигнал должен быть функцией, объявленной как сигнал в заголовке. Функция-слот может быть любой функцией или функтором, которые могут быть подключены к сигналу. Функция может быть подключена к данному сигналу, если сигнал имеет как минимум столько же аргументов, сколько и слот. Функтор может быть подключен к сигналу, если они имеют точно такое же количество аргументов. Должно существовать неявное преобразование между типами соответствующих аргументов в сигнале и слоте.
Пример:
void someFunction(); QPushButton *button = new QPushButton; QObject::connect(button, &QPushButton::clicked, this, someFunction, Qt::QueuedConnection);
Если ваш компилятор поддерживает лямбда-выражения C++11, вы можете использовать их:
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); Подключение будет автоматически отключено, если отправитель или контекст будут уничтожены. Однако вы должны позаботиться о том, чтобы любые объекты, используемые внутри функтора, оставались живыми, когда сигнал отправляется.
Примечание: Если компилятор не поддерживает вариадные шаблоны C++11, количество аргументов в сигнале или слоте ограничено 6, а объект функтора не должен иметь перегруженный или шаблонный оператор ().
Примечание: Эта функция является потокобезопасной.
Эта функция была представлена в 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.
[slot] void QObject::deleteLater()
Планирует удаление этого объекта.
Объект будет удален при возвращении управления в цикл событий. Если цикл событий не запущен при вызове этой функции (например, deleteLater() вызывается для объекта до QCoreApplication::exec()), объект будет удален, как только цикл событий запустится. Если deleteLater() вызывается после того, как основной цикл событий был остановлен, объект не будет удален. Начиная с Qt 4.8, если deleteLater() вызывается для объекта, который существует в потоке без запущенного цикла событий, объект будет уничтожен по завершении потока.
Обратите внимание, что вход и выход из нового цикла событий (например, путём открытия модального диалогового окна) не приведут к отложенному удалению; для того, чтобы объект был удален, управление должно вернуться в цикл событий, из которого был вызван deleteLater().
Примечание: Безопасно вызывать эту функцию более одного раза; когда первое отложенное событие удаления будет доставлено, все ожидающие события для объекта будут удалены из очереди событий.
См. также destroyed() и QPointer.
[signal] void QObject::destroyed(QObject *obj = Q_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() обычно используется тремя способами, как показано в следующих примерах.
- Отключить всё, что подключено к сигналам объекта:
disconnect(myObject, 0, 0, 0);
эквивалентно нестатической перегруженной функции
myObject->disconnect();
- Отключить всё, что подключено к определённому сигналу:
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
эквивалентно нестатической перегруженной функции
myObject->disconnect(SIGNAL(mySignal()));
- Отключить конкретного получателя:
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 и не отключает сигналы и слоты, если:
- signal не является членом класса sender или одного из его родительских классов.
- method не является членом класса receiver или одного из его родительских классов.
- 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 = Q_NULLPTR, const QObject *receiver = Q_NULLPTR, const char *method = Q_NULLPTR) const
Эта функция перегружает disconnect().
Отключает signal от method объекта receiver.
Подключение сигнал-слот удаляется, когда один из участвующих объектов уничтожается.
Примечание: Эта функция является потокобезопасной.
bool QObject::disconnect(const QObject *receiver, const char *method = Q_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, 0, 0, 0);
- Отключить всё, подключенное к конкретному сигналу:
disconnect(myObject, &MyObject::mySignal(), 0, 0);
- Отключить конкретного получателя:
disconnect(myObject, 0, myReceiver, 0);
- Отключить подключение от одного конкретного сигнала к конкретному слоту:
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()
Выводит информацию о подключениях сигналов и т. д. для этого объекта в вывод отладки.
Этот метод полезен для отладки, но не выполняет никаких действий, если библиотека была скомпилирована в режиме релиз (т. е. без отладочной информации).
См. также dumpObjectTree().
void QObject::dumpObjectTree()
Выводит дерево дочерних элементов в вывод отладки.
Этот метод полезен для отладки, но не выполняет никаких действий, если библиотека была скомпилирована в режиме релиз (т. е. без отладочной информации).
См. также 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)
{
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);
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 ®Exp, 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);
};
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().
END_OF_DOCUMENT_MARKER
[protected] QObject *QObject::sender() const
Возвращает указатель на объект, который отправил сигнал, если вызывается в слоте, активированном сигналом; в противном случае возвращает 0. Указатель действителен только во время выполнения слота, который вызывает эту функцию из контекста потока данного объекта.
Указатель, возвращённый этой функцией, становится недействительным, если отправитель уничтожен или если слот отключен от сигнала отправителя.
Предупреждение: Эта функция нарушает объектно-ориентированный принцип модульности. Однако доступ к отправителю может быть полезен, когда множество сигналов подключено к одному слоту.
Предупреждение: Как указано выше, возвращаемое значение этой функции недействительно, когда слот вызывается через Qt::DirectConnection из потока, отличного от потока данного объекта. Не используйте эту функцию в таких сценариях.
См. также senderSignalIndex() и QSignalMapper.
[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);
};
MyObject::MyObject(QObject *parent)
: QObject(parent)
{
startTimer(50); // 50-millisecond timer
startTimer(1000); // 1-second timer
startTimer(60000); // 1-minute timer
}
void MyObject::timerEvent(QTimerEvent *event)
{
qDebug() << "Timer ID:" << event->timerId();
} Обратите внимание, что точность QTimer зависит от базовой операционной системы и аппаратного обеспечения. Аргумент timerType позволяет настроить точность таймера. См. Qt::TimerType для получения информации о различных типах таймеров. Большинство платформ поддерживают точность 20 миллисекунд; некоторые предоставляют больше. Если Qt не может доставить нужное количество событий таймера, оно будет молча игнорировать некоторые из них.
Класс QTimer предоставляет высокоуровневый интерфейс программирования с таймерами единовременного действия и сигналами таймера вместо событий. Также имеется класс QBasicTimer, который более лёгкий, чем QTimer, и менее громоздкий, чем использование идентификаторов таймеров напрямую.
См. также 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_NULLPTR, int n = -1)
Возвращает переведённую версию 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 в целом и раздел Разъяснение неоднозначностей для получения информации о разъяснении неоднозначностей.
Предупреждение: Этот метод рекурсивен только если все переводчики установлены до вызова этого метода. Установка или удаление переводчиков во время выполнения переводов не поддерживается. Это, вероятно, приведёт к сбою или другому нежелательному поведению.
См. также 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().
Связанные не члены
typedef QObjectList
QList<T> qFindChildren(const QObject *obj, const QRegExp ®Exp)
Эта функция перегружает qFindChildren().
Эта функция эквивалентна obj->findChildren<T>(regExp).
Примечание: Эта функция была предоставлена в качестве обходного решения для MSVC 6, который не поддерживал шаблонные функции-члены. Рекомендуется использовать другой вариант в новом коде.
См. также QObject::findChildren().
T qobject_cast(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().
Документация макросов
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 Сигналы и слоты с механизмом сигналов/слотов сторонних разработчиков.
Макрос обычно используется, когда no_keywords указано с переменной CONFIG в файле .pro, но он может быть использован даже когда no_keywords не указано.
Q_ENUM(...)
Этот макрос регистрирует тип перечисления в системе метаобъектов. Он должен быть размещён после объявления перечисления в классе, имеющем макрос Q_OBJECT или Q_GADGET.
Например:
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_FLAG(...)
Этот макрос регистрирует отдельный тип флагов в системе метаобъектов. Он обычно используется в определении класса, чтобы объявить, что значения заданного перечисления могут использоваться как флаги и комбинироваться с помощью оператора побитового ИЛИ.
Макрос должен быть размещён после объявления перечисления.
Например, в 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_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_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(Объект)
Этот макрос присваивает Объекту имя объекта "Объект".
Не имеет значения, является ли Объект указателем или нет, макрос это определяет сам.
Эта функция была представлена в Qt 5.0.
См. также QObject::objectName().
Q_SIGNAL
Это дополнительный макрос, который позволяет пометить отдельную функцию как сигнал. Он может быть очень полезным, особенно когда вы используете парсер кода сторонних разработчиков, который не понимает группы signals или Q_SIGNALS.
Используйте этот макрос для замены ключевого слова signals в объявлениях классов, когда вы хотите использовать Qt Сигналы и слоты с механизмом сигналов/слотов сторонних разработчиков.
Макрос обычно используется, когда no_keywords указано с переменной CONFIG в файле .pro, но он может быть использован даже когда no_keywords не указано.
Q_SIGNALS
Используйте эту макрос для замены ключевого слова signals в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слот с механизмом сигналов/слотов стороннего разработчика.3rd party signal/slot mechanism.
Макрос обычно используется, когда no_keywords указано с переменной CONFIG в файле .pro, но его можно использовать и когда no_keywords не указано.
Q_SLOT
Это дополнительная макрос, которая позволяет пометить отдельную функцию как слот. Это может быть очень полезно, особенно если вы используете парсер кода стороннего разработчика, который не понимает группы slots или Q_SLOTS.
Используйте эту макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слот с механизмом сигналов/слотов стороннего разработчика.3rd party signal/slot mechanism.
Макрос обычно используется, когда no_keywords указано с переменной CONFIG в файле .pro, но его можно использовать и когда no_keywords не указано.
Q_SLOTS
Используйте эту макрос для замены ключевого слова slots в объявлениях классов, когда вы хотите использовать Qt Сигналы и Слот с механизмом сигналов/слотов стороннего разработчика.3rd party signal/slot mechanism.
Макрос обычно используется, когда no_keywords указано с переменной CONFIG в файле .pro, но его можно использовать и когда no_keywords не указано.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qobject.html