当前位置:网站首页>一、Qt的核心类QObject
一、Qt的核心类QObject
2022-07-02 06:30:00 【代码海贼团船长】
Qt的核心类QObject
- 使用
- Properties(性质)
- public Function(公共函数)
- 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 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 findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
- QList 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(公共槽函数)
- Signals
- 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(保护函数)
- 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(相关非成员)
- Macros(宏)
- 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
使用
头文件:include <QObject>
在项目文件中添加QT += core
子类:QAbstractAnimation, QAbstractEventDispatcher, QAbstractItemDelegate, QAbstractItemModel, QAbstractNetworkCache, QAbstractState, QAbstractTextDocumentLayout, QAbstractTransition, QAccessiblePlugin, QAction, QActionGroup, QAxFactory, QAxObject, QAxScript, QAxScriptManager, QButtonGroup, QClipboard, QCompleter, QCoreApplication, QDataWidgetMapper, QDBusAbstractAdaptor, QDBusAbstractInterface, QDBusPendingCallWatcher, QDBusServer, QDBusServiceWatcher, QDBusVirtualObject, QDesignerFormEditorInterface, QDesignerFormWindowManagerInterface, QDnsLookup, QDrag, QDtls, QDtlsClientVerifier, QEventLoop, QExtensionFactory, QExtensionManager, QFileSelector, QFileSystemWatcher, QFutureWatcher, QGenericPlugin, QGesture, QGraphicsAnchor, QGraphicsEffect, QGraphicsItemAnimation, QGraphicsObject, QGraphicsScene, QGraphicsTransform, QHttpMultiPart, QIconEnginePlugin, QImageIOPlugin, QInputMethod, QIODevice, QItemSelectionModel, QJSEngine, QLayout, QLibrary, QLocalServer, QMacToolBar, QMacToolBarItem, QMimeData, QMovie, QNetworkAccessManager, QNetworkConfigurationManager, QNetworkCookieJar, QNetworkSession, QObjectCleanupHandler, QOffscreenSurface, QOpenGLContext, QOpenGLContextGroup, QOpenGLDebugLogger, QOpenGLShader, QOpenGLShaderProgram, QOpenGLTimeMonitor, QOpenGLTimerQuery, QOpenGLVertexArrayObject, QPdfWriter, QPictureFormatPlugin, QPluginLoader, QQmlComponent, QQmlContext, QQmlEngineExtensionPlugin, QQmlExpression, QQmlFileSelector, QQmlPropertyMap, QQuickImageResponse, QQuickItem, QQuickItemGrabResult, QQuickRenderControl, QQuickTextDocument, QQuickTextureFactory, QScreen, QScroller, QSessionManager, QSettings, QSGAbstractRenderer, QSGEngine, QSGTexture, QSGTextureProvider, QSharedMemory, QShortcut, QSignalMapper, QSocketNotifier, QStyle, QStyleHints, QStylePlugin, QSyntaxHighlighter, QSystemTrayIcon, QTcpServer, QTextDocument, QTextObject, QThread, QThreadPool, QTimeLine, QTimer, QTranslator, QUndoGroup, QUndoStack, QValidator, QWidget, QWindow, QWinEventNotifier, QWinJumpList, QWinTaskbarButton, QWinTaskbarProgress, QWinThumbnailToolBar, and QWinThumbnailToolButton
Note: All functions in this class are reentrant.这个类中所有的函数是可重入的。
Properties(性质)
objectName 对象名,这个性质可以使用void setObjectName(const QString &name)设置,和
QString objectName() const 来获取。
若objectName发生改变,会发出(signals)信号void objectNameChanged(const QString &objectName)
public Function(公共函数)
QObject(QObject *parent = nullptr)
这是QObject的构造函数,参数QObject *parent可设置当前QObject的父对象,可使用parent()访问父对象的指针,使用findChild()和findChildren()查找子对象和子对象集合。
virtual ~QObject()
自动断开此对象的所有信号连接,并从事件队列中删除对象的所有挂起的已发布事件。
使用deleteLater()通常比直接删除QObject子类更安全。
QObject *mpObjectParent = new QObject(this);
QObject *mpObject = new QObject(mpObjectParent)
mpObjectParent->deleteLater()
//使用此函数调用析构函数,
//删除父对象(mpObjectParent指针指向的对象)的同时,
//也删除子对象(mpObject指针指向的对象)
bool blockSignals(bool block)
用于设置信号阻塞。可以使用下文的bool signalsBlocked() const函数访问参数的状态。次函数可以设置信号阻塞,参数block设置为true,信号阻塞,函数返回false,设置信号不阻塞,参数block设置为false,信号不阻塞,函数返回true。
connect(this,&MainWindow::objectNameChanged,this,&MainWindow::slotShowObjectName);
setObjectName("ObjectName_1");
qDebug()<<blockSignals(1);
qDebug()<<signalsBlocked();
setObjectName("ObjectName_2");
qDebug()<<blockSignals(0);
qDebug()<<signalsBlocked();
setObjectName("ObjectName_3");
void slotShowObjectName(QString str)
{
qDebug()<<str;
}
/* 输出: "ObjectName_1" false true true false "ObjectName_3" */
const QObjectList &children() const
typedef QList<QObject*> QObjectList;
返回所有的子对象列表。
QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const QObject *receiver, const char *method = nullptr) const
详见Qt的connect函数和disconnect函数详解。
void dumpObjectInfo() const
将此对象的信号连接等信息转储到调试输出,用来输出对象的输入信号和输出信号。
void dumpObjectTree() const
将子目录树转储到调试输出,用来显示子对象树的输出
QList dynamicPropertyNames() const
显示setProperty的性质列表。
virtual bool event(QEvent *e)
重写事件,如下官方示例。
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);
}
};
virtual bool eventFilter(QObject *watched, QEvent *event)
重写对象中watched的事件,与installEventFilter()一起使用。
官方示例:
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);
}
}
T findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
返回对象的一个子对象,参数name设置筛选名字,options是设置搜寻范围;
Qt::FindChildrenRecursively:递归搜索
枚举 | 解释 |
---|---|
Qt::FindChildrenRecursively | 递归搜索 |
Qt::FindDirectChildrenOnly | 仅子对象搜索 |
QList findChildren(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
返回对象的一个子对象列表,参数name设置筛选名字,options是设置搜寻范围;
Qt::FindChildrenRecursively:递归搜索
Qt::FindDirectChildrenOnly:仅子对象搜索
QList findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
返回对象的一个子对象列表,参数re设置正向表达式,options是设置搜寻范围;
Qt::FindChildrenRecursively:递归搜索
Qt::FindDirectChildrenOnly:仅子对象搜索
bool inherits(const char *className) const
判断对象是否继承于className.
void installEventFilter(QObject *filterObj)
与virtual bool eventFilter(QObjectwatched,QEventevent)一起使用
bool isWidgetType() const
判断是否为“QWidget”类型窗体。
bool isWindowType() const
判断是否为“QWindow”类型窗体。
void killTimer(int id)
停止该ID的定时器,该定时器使用下文中的startTimer()启动。
virtual const QMetaObject *metaObject() const
返回元对象类
void moveToThread(QThread *targetThread)
moveToThread 方法,是把我们需要的工作全部封装在一个类中,将每个任务定义为一个槽函数,再建立触发这些槽函数的信号,然后连接信号和槽,最后调用 moveToThread 方法将这个类交给一个 QThread 对象,再调用 QThread 的 start() 函数使其全权处理事件循环。于是,任何时候我们需要让子线程执行某个任务,只需要发出对应的信号就可以。
其优点是我们可以在一个 worker 类中定义很多个需要做的工作,然后触发信号,子线程就可以执行。相比于继承 QThread 方法,只能执行 run() 函数中的任务,moveToThread 的方法中一个线程可以做很多不同的工作,只要实现对应的槽函数,触发对应的信号即可。引用自
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)
设置动态属性。如果该属性是在类中使用Q_PROPERTY定义的,则成功时返回true,否则返回false。如果该属性未使用Q_属性定义,因此未在元对象中列出,则将其添加为动态属性,并返回false。
有关所有可用属性的信息通过metaObject()和dynamicPropertyNames()提供。
可以使用property()再次查询动态属性,也可以通过将属性值设置为无效的QVariant来删除动态属性。更改动态属性的值会导致QDynamicPropertyChangeEvent发送到对象。
注意:以“q”开头的动态属性保留用于内部目的。
bool signalsBlocked() const
访问信号是否阻塞
int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)
开始定时器
Qt::PreciseTimer 0 Precise timers try to keep millisecond accuracy(精准,耗费资源)
Qt::CoarseTimer 1 Coarse timers try to keep accuracy within 5% of the desired interval(粗糙)
Qt::VeryCoarseTimer 2 Very coarse timers only keep full second accuracy(非常粗糙)
int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer)
详见上一注释
QThread *thread() const
返回对象的线程指针。
Public Slots(公共槽函数)
void deleteLater()
有计划的析构对象指针,比delete更安全。
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)
详见Qt的connect函数和disconnect函数详解。
QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
详见Qt的connect函数和disconnect函数详解。
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
详见Qt的connect函数和disconnect函数详解。
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
详见Qt的connect函数和disconnect函数详解。
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const QMetaObject::Connection &connection)
详见Qt的connect函数和disconnect函数详解。
bool disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
详见Qt的connect函数和disconnect函数详解。
const QMetaObject staticMetaObject
返类的元对象信息。
QString tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
使用此函数的字符串,可以在qt国际化中翻译。
Protected Functions(保护函数)
virtual void childEvent(QChildEvent *event)
子对象事件。
virtual void connectNotify(const QMetaMethod &signal)
当建立connect时,触发此函数。
virtual void customEvent(QEvent *event)
virtual void disconnectNotify(const QMetaMethod &signal)
当disconnect时,触发此函数。
bool isSignalConnected(const QMetaMethod &signal) const
判断信号是否有连接。
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
QByteArray data;
data = get_the_value(); // expensive operation
emit valueChanged(data);
}
int receivers(const char *signal) const
判断信号连接的数量。
if (receivers(SIGNAL(valueChanged(QByteArray))) > 0) {
QByteArray data;
get_the_value(&data); // expensive operation
emit valueChanged(data);
}
QObject *sender() const
调用发送信号的QObject指针。
int senderSignalIndex() const
返回连接发送信号的对象的索引。
virtual void timerEvent(QTimerEvent *event)
定时器事件,和startTimer()、killTimer(),可以一起使用
Related Non-Members(相关非成员)
typedef QObjectList
QList<QObject*>的同义词。
QList qFindChildren(const QObject *obj, const QRegExp ®Exp)
此函数重载qFindChildren()。详见findChildren()
T qobject_cast(QObject *object)和T qobject_cast(const QObject *object)
本方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0。
在使用时有两个限制:
1、T类型必须继承自QObject。
2、在声明时必须有Q_OBJECT宏。
Macros(宏)
QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
信号槽参数禁止窄化转换。
比如信号参数为double类型,对应的槽函数类型为int,信号槽关联后运行起来是没问题的,在槽函数中处理时double类型的值会窄化转成int类型的值,在pro文件中加入此宏:
DEFINES += QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
编译就会报错。
Q_CLASSINFO(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()可以访问这个定义。
Q_DISABLE_COPY(Class)
禁用对给定类使用复制构造函数和赋值运算符。
QObject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY() 宏放在了private区域。因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有。
为什么要这样做?
我们都知道Qt对标准C++增加了一些功能:signals, slots, object properties, events, event filters, string translation, timers,object trees, guarded pointers, dynamic cast.
新加入的这些功能就要求我们把每一个QObject的对象看做是唯一(identities)的。唯一的意思就是不能通过拷贝或者赋值操作
制作出一个一模一样的复制体。
试想如果我们有一个QPushButton对象btnSubmit,如果我们可以复制出一个和btnSubmint完全一样的button对象,那么新的button对象的名字应该是什么?如果也叫btnSubmit,当我们给其中的btnSubmit接收事件或发出信号时,系统如何区分把事件由哪个button对象接收,或者哪个对象发送了信号?
我们知道在各种容器中能以value方式存放的类型,必须有默认的构造函数,拷贝构造函数和赋值操作。由于QObject及所有继承自它的子类都没有提供拷贝构造和赋值操作,当我们使用QList时,编译器就会报错。如果我们要在容器中存储这中类型的对象,我们就要使用它们的指针。如QList<QObject *>
Q_DISABLE_COPY_MOVE(Class)
一个方便的宏,禁止对给定类使用复制构造函数、赋值运算符、移动构造函数和移动赋值运算符;
Q_DISABLE_MOVE(Class)
一个方便的宏,禁止对给定类使用移动构造函数和移动赋值运算符;
Q_EMIT
Q_EMIT rosShutdown(); //Q_EMIT 的作用与emit相同
原因:
一些第三方库如boost会使用emit等关键字。
Q_EMIT代替Qt中本来的的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)
同setOBjectName(QString)。
Q_SIGNAL
Q_SIGNALS
Q_SLOT
Q_SLOTS
边栏推荐
- Gateway is easy to use
- The best blog to explain the basics of compilation (share)
- HCIA - data link layer
- HCIA—数据链路层
- Global and Chinese markets of tilting feeders 2022-2028: Research Report on technology, participants, trends, market size and share
- 路由基础—动态路由
- OpenShift 部署应用
- 群辉 NAS 配置 iSCSI 存储
- 旋转链表(图解说明)
- Openshift deployment application
猜你喜欢
OpenShift构建镜像
ARP and ARP Spoofing
Minecraft群组服开服
Minecraft模组服开服
2022 Heilongjiang latest construction eight members (materialman) simulated examination questions and answers
Use C language to receive JSON strings
什么是SQL注入
Web技术发展史
Aneng logistics' share price hit a new low: the market value evaporated by nearly 10 billion yuan, and it's useless for chairman Wang Yongjun to increase his holdings
Minecraft group service opening
随机推荐
Mutex
C language replaces spaces in strings with%20
Zipkin is easy to use
zipkin 简单使用
用数字 5,5,5,1 ,进行四则运算,每个数字当且仅当用一次,要求运算结果值为 24
OpenShift 容器平台社区版 OKD 4.10.0部署
C language custom type enumeration, Union (clever use of enumeration, calculation of union size)
双向链表的实现(双向链表与单向链表的简单区别联系和实现)
HCIA—應用層
CarSim learning experience - rough translation 1
Detailed explanation of NIN network
Illegal use of crawlers, an Internet company was terminated, the police came to the door, and 23 people were taken away
k8s入门:Helm 构建 MySQL
OpenFeign 简单使用
Minecraft插件服开服
Web安全--核心防御机制
TCP/IP—传输层
sqli-labs(POST类型注入)
The best blog to explain the basics of compilation (share)
2022 Heilongjiang's latest eight member (Safety Officer) simulated test question bank and answers