QObject隐藏知识点1

  1. QObject::disconnect(sender, signal, receiver, method)

这三个参数signal, receiver, method都可以为0,为0时代表“任意”(所有)信号槽

disconnect(sender, 0, 0, 0) // 取消sender所有信号连接所有接受者所有槽函数

disconnect( s, 0, r1, 0 ) //

disconnect( s, SIGNAL(signal1()), r1, 0 ) //

disconnect( s, SIGNAL(signal1()), 0, 0 ) //

  1. QObject::connect(sender, signal, receiver, method)

receiver为this时可省略,只传三个参数

  1. int QObject::receivers(signal)

返回signal信号连接槽的数量

class Object : public QObject
{
public:
    int receivers(const char* signal) const
    { return QObject::receivers(signal); }
};

Object object;
QCOMPARE(object.receivers(SIGNAL(destroyed())), 0);
object.connect(&object, SIGNAL(destroyed()), SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 1);
object.connect(&object, SIGNAL(destroyed()), SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 2);
object.disconnect(SIGNAL(destroyed()), &object, SLOT(deleteLater()));
QCOMPARE(object.receivers(SIGNAL(destroyed())), 0);

  1. QMetaObject::connectSlotsByName

void on_<object name>_<signal name>(<signal parameters>);

每个槽函数都会寻找对应信号,objectName设置为“myobject”

mysig() --> on_myobject_mysig()

mysig(int a) --> on_myobject_mysig(int a)

mysig(int a, int b) --> on_myobject_mysig(int a, int b)

需要注意的是,当注释第一个信号mysig(), on_myobject_mysig()找不到信号mysig(),但有同名的另外两个信号mysig(int a)和mysig(int a, int b),此时会建立以下连接

mysig(int a) --> on_myobject_mysig() // 猜测与mysig(int a)最接近

mysig(int a) --> on_myobject_mysig(int a)

mysig(int a, int b) --> on_myobject_mysig(int a, int b)

// myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);

signals:
//    void mysig();   // 此处是关键,注释后有意外发现
    void mysig(int a);
    void mysig(int a, int b);

public slots:
    void on_myobject_mysig();
    void on_myobject_mysig(int a);
    void on_myobject_mysig(int a, int b);
};

#endif // MYCLASS_H
// myclass.cpp
#include "myclass.h"

#include <QDebug>

MyClass::MyClass(QObject *parent) : QObject(parent)
{
    setObjectName("myobject");
    QMetaObject::connectSlotsByName(this);
}

void MyClass::on_myobject_mysig()
{
    qDebug() << "MyClass::on_myobject_mysig()";
}

void MyClass::on_myobject_mysig(int a)
{
    qDebug() << "MyClass::on_myobject_mysig(int a)";
}

void MyClass::on_myobject_mysig(int a, int b)
{
    qDebug() << "MyClass::on_myobject_mysig(int a, int b)";
}
// main.cpp

#include <QCoreApplication>
#include "myclass.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyClass m;
    emit m.mysig(5);

    return a.exec();
}
  1. 查找子类对象,有以下两个

  • qFindChild

  • qFindChildren (支持正则表达式)

  • QObject::findChild(name, options)

  • QObject::findChildren(name, options)

特殊情况

qFindChild<QObject*>(object); // 返回object对象的第一个子类

qFindChild<QObject*>(object, QString()); // 返回object对象的第一个子类

qFindChild<QObject*>(object, ""); // 返回objectname为 "" 的子类,或者未设置objectname的对象

l = qFindChildren<QObject*>(&o); // 返回object对象的所有子类

l = qFindChildren<QObject*>(&o, ""); // 返回子类数组,objectname为 "" 的子类,或者未设置 objectname的对象

object.findChild<QObject*>("o1", Qt::FindDirectChildrenOnly); // 返回object对象objectname为"o1",并且为object的直接子类(第1级子类)

QObject o;          // objectName: "o"
QObject o1(&o);     // objectName: "o1"
QObject o2(&o);     // objectName: "o2"
QObject o11(&o1);   // objectName: "o11"
QObject o12(&o1);   // objectName: "o12"
QObject o111(&o11); // objectName: "o111"
QObject unnamed(&o);// 未设置objectName,默认为""
QTimer t1(&o);      // objectName: "t1"
QTimer t121(&o12);  // objectName: "t121"
QTimer emptyname(&o);  // objectName: ""

Q_SET_OBJECT_NAME(o);
Q_SET_OBJECT_NAME(o1);
Q_SET_OBJECT_NAME(o2);
Q_SET_OBJECT_NAME(o11);
Q_SET_OBJECT_NAME(o12);
Q_SET_OBJECT_NAME(o111);
Q_SET_OBJECT_NAME(t1);
Q_SET_OBJECT_NAME(t121);
emptyname.setObjectName("");
QList<QObject*> l;
QList<QTimer*> tl;

l = qFindChildren<QObject*>(&o, QRegExp("o.*"));  // 或者 QRegularExpression
QCOMPARE(l.size(), 5);
l = qFindChildren<QObject*>(&o, QRegExp("t.*"));
QCOMPARE(l.size(), 2);

tl = qFindChildren<QTimer*>(&o, QRegExp(".*"));
QCOMPARE(tl.size(), 3);
tl = qFindChildren<QTimer*>(&o, QRegExp("o.*"));
QCOMPARE(tl.size(), 0);
l = o.findChildren<QObject*>(QRegularExpression("t.*"));
QCOMPARE(l.size(), 2);
QObject *op = 0;

op = qFindChild<QObject*>(&o);     // 默认参数为QString(), 返回o对象的第一个子类
QCOMPARE(op, &o1);
op = qFindChild<QObject*>(&o, ""); // 返回objectname为""的第一个子类
QCOMPARE(op, &unnamed);
op = qFindChild<QObject*>(&o, "unnamed");  // 未找到返回nullptr
QCOMPARE(op, static_cast<QObject *>(0));
  1. 监测QObject信号槽连接,重载以下两个函数

class QObject {
public:
    virtual void connectNotify(const QMetaMethod &signal);
    virtual void disconnectNotify(const QMetaMethod &signal);
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QObjectQt 库中的一个基础类。它是所有 Qt 对象的基类,提供了许多基本的对象管理功能,包括内存管理、事件通信、信号和槽机制以及属性系统。 使用 QObject 的子类可以很容易地在应用程序中实现事件驱动的行为,并且可以利用 Qt 的信号和槽机制在对象之间进行通信。 例如,可以使用 QObject::connect 函数来连接一个对象的信号到另一个对象的槽函数,从而在信号发出时调用槽函数。这种机制可以让你很容易地在应用程序中实现事件驱动的行为,并且可以使用 Qt 的信号和槽机制在对象之间进行通信。 ### 回答2: Qt是一种跨平台的C++开发框架,用于构建图形界面和应用程序。QObjectQt框架中的一个核心类,用于实现对象的即时信号和槽机制。 QObject提供了各种功能,例如对象的属性系统、线程支持、对象的生命周期管理等。在Qt中,所有类都继承自QObject或者其子类,以获得这些功能。 QObject的一个重要特性是信号和槽机制。信号和槽机制是一种对象间通信的方式,通过信号实现对象的某个事件的触发,然后通过槽函数来处理事件。信号和槽机制可以实现耦合度低、灵活性高的对象间通信,非常方便。 此外,QObject还有一个属性系统,用于管理对象的属性。属性可以是对象的状态或配置信息,可以通过属性系统实现对属性的读取和修改。属性系统提供了一种方便的方式来处理对象的状态变化或界面显示问题。 另外,QObject提供了对对象生命周期的管理。Qt中的对象可以是直接由new操作符动态创建的,也可以是作为父对象的子对象。当父对象删除时,它会自动删除其所有子对象,以避免内存泄漏问题。 总而言之,QObjectQt框架中非常重要的一个类,提供了诸多功能,例如信号和槽机制、属性系统、对象生命周期管理等。它使得Qt开发更加方便和高效,极大地简化了开发人员的工作。 ### 回答3: Qt中的QObject是一个基类,用于构建具有对象管理和信号槽机制的应用程序。 QObject提供了一些重要的特性,使得Qt应用程序开发更加方便和灵活。首先,QObject提供了对象树的构造和管理能力。通过将QObject对象组织成树状结构,可以轻松地管理应用程序中的对象,包括对象的创建、销毁和层次关系等。这种对象树的管理机制使得QObject更适合构建大型复杂的应用程序。 QObject还提供了信号槽机制,用于实现对象之间的通信和交互。信号槽机制基于事件驱动的方式,当对象的某个状态发生变化或者执行某个操作时,会发出一个信号。其他对象可以通过连接到这个信号的槽函数来接收和处理这个信号。这种松耦合的通信方式使得应用程序的组件之间能够相互独立,易于维护和扩展。 QObject还提供了一些其他功能,包括动态属性的支持、线程安全的信号槽连接、对象的元对象信息等。动态属性功能允许在运行时为QObject对象添加自定义的属性,并且可以通过属性更改通知信号和属性读写方法进行访问。线程安全的信号槽连接确保多线程环境下信号槽的安全性和正确性。元对象信息允许在运行时获取对象的类型信息,包括类名、成员变量、方法等。 总之,Qt中的QObject是一个重要的基类,提供了对象管理和信号槽机制等核心功能,使得Qt应用程序开发更加简洁、灵活和可维护。它的使用可以大大提高应用程序的开发效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值