QObject

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志~
一、 QObject概述

说到Qt,你肯定首先想到的就是信号和槽,而这就不得不提到Qobject,这次和大家分享下QObject

的相关内容,并对一些内容进行代码说明,方便理解。



QObject 类是Qt对象模型





Qt 绝大部分类都是继承该类实现的。


  该模型的


核心特点是提供了一种对象之间的通讯机制
——信号和槽。你可以使用connect



()将信号连接到插槽,也可以使用disconnect



() 来断开
连接。为了避免一直通知槽函数,还可以使用blockSignals


()来暂时阻塞信号。


QObjects 会把组织一个对象模型,这也是我们常说的Qt对象树模型。当你创建一个
QObject 并使用其他对象作为父对象时,这个对象会自动添加到父对象的children()列表中。父对象拥有子对象的所有权,即父对象将在析构函数中自动删除其child对象。可以通过findChild()或findChildren()来查找对象。听起来有点绕,之后会使用代码进行说明



会有代码说明


每个对象都有一个对象名称(objectName())和类名称 (class name),
他们都可以通过相应的 metaObject
对象来获得。你还可以通过 inherits()
方法来判断一个对象的类是不是从另一个类继承而来。

当对象被删除时,它发出destroyed()信号。你可以捕获这个信号来避免对QObject

的无效引用



会有代码说明



QObject 可以通过event()
接收事件



会有代码说明



并且过滤其它对象的事件。详细情况请参考
installEventFilter() 和eventFilter()

最后要注意的一点是,QObject在Qt中提供了基本的计时器支持。

  有关定时器的高级支持,请参见QTimer


 

注意,对于实现信号和插槽或属性


本次不做说明



的任何对象,Q_OBJECT宏是必须的。


  

Qt 官方


强烈建议在QObject
的所有子类中都使用

该宏,不论它们是否实际使用信号和插槽或属性,因为不这样做可能会导致某些奇葩的错误。我个人是不愿意解决奇葩的错误的,比较浪费精力。

所有Qt的窗体都继承自QObject。

  便捷函数isWidgetTye()



返回对象是否是窗体部件
bool


。一些QObject
函数

(例如children


())返回QObjectList




QObjectList是QList的typedef





会有代码说明

二、  对应代码

Widget


简要概述,继承自
QWidget,没有.ui文件。

构造函数中:
①按钮实例化

QPushButton *button1 = new QPushButton(this);

button1->setText("one");


QPushButton *button2 = new QPushButton(this); button2->setText("two");
QPushButton *button3 = new QPushButton(this); button3->setText("three");
QPushButton *button4 = new QPushButton(this); button4->setText("four");
button5 = new QPushButton(this); //类成员变量 button5->setText("five");

②添加布局

QHBoxLayout *layout = new QHBoxLayout(this);   //

layout->addWidget(button1);

layout->addWidget(button2);

layout->addWidget(button3);

layout->addWidget(button4);

layout->addWidget(button5);


this->setLayout(layout); this->resize(700, 200); //不将窗体设置大一些的话会有警告,警告如下 //(QPushButton(0x1f61ca50), QPushButton(0x1f61ce90), // QPushButton(0x1f61cf10), QPushButton(0x1f61cf90), // QPushButton(0x1f61cb10), QHBoxLayout(0x793f40))

上面程序警告是因为父对象几何框架较小不能容纳下子类视图,所以导致了对父对象的重新构造。重新设置父对象窗体大小即可;本程序中是因为按钮有最小尺寸导致的。
③使用概述QObject中的几个函数

bool ret = this->isWidgetType();

qDebug() << "isWidgetType" << ret;


qDebug() <children();
connect(button1,&QPushButton::clicked, this,&Widget::slot_buttonClicked); //qt5 new signal and slot
connect(button5,&QPushButton::destroyed, this,&Widget::slot_objectDestroy); //对象被删除会触发对应的槽函数

④槽函数

//第一个按钮按下触发删除按钮5的槽函数

void Widget::slot_buttonClicked()

{

    qDebug() << "You want to delete button5 !!!";


if(nullptr != button5) { button5->deleteLater(); button5 = nullptr; }
}
//对象被删除会触发对应的槽函数 void Widget::slot_objectDestroy() { qDebug() << "Object destroy"; }

⑤事件处理例子

//事件处理

bool Widget::event(QEvent *e)

{

    if(QEvent::KeyPress == e->type())

    {

        QKeyEvent *keyEvent = static_cast(e);

        if (keyEvent->key() == Qt::Key_Shift)

        {

            qDebug() << "You press shift.";

            return true;

        }

    }


// convey parent process return QWidget::event(e);
}

程序运行效果:
①运行效果

②点击第一个按钮效果 >>
按下 Shift
按键效果:


这次不小结了~~~