当前位置:   article > 正文

Qt编程之Qt中的核心机制_qt核心机制

qt核心机制

     本次内容主要为Qt中的一些核心机制,它们是构成Qt的基础,包括对象模型、信号和槽、属性系统、对象树与拥有权、元对象系统等。

    1.对象模型

    在已有的标准C++对象模型(可以在运行时非常有效地支持对象范式)的基础上添加一些特性,形成了自己的对象模型。这些特性有:

    ·信号和槽(Qt的核心特征,用于两个对象之间的通信)

    ·对象属性系统(基于元对象系统)

         要在一个类中声明属性,该类必须继承自QObject类,而且还要在声明前使用Q_PROPERTY()宏:

        

  1. Q_PROPERTY(type name
  2. (READ getFunction[WRITE setFunction]|MEMBER memberName[(READ getFunction|WRITE setFunction)])
  3. [RESER resertFunction]
  4. [NOTIFY notifSignal]
  5. [REVISION int]
  6. [DESIGNABLE bool]
  7. [SCRIPTABLE bool]
  8. [STORED bool]
  9. [USER bool]
  10. [CONSTANT]
  11. [FINAL]
  12. )

    ·事件和事件过滤器

    ·国际化字符串翻译机制

    ·定时器驱动

    ·分层结构的、可查询的对象树

     组织和管理所有的QObject类及其子类的对象。当创建一个QObject时,如果使用了其他的对象作为其父对象(parent),那么这个QObject就会被添加到父对象的children()列表中;当父对象被销毁时,这个QObject也会被销毁。这个机制非常适合于管理管理GUI对象。


  1. #ifndef MYBUTTON_H
  2. #define MYBUTTON_H
  3. #include <QPushButton>
  4. class MyButton : public QPushButton
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit MyButton(QWidget *parent = 0);
  9. ~MyButton();
  10. };
  11. #endif // MYBUTTON_H

这里主要是添加了析构函数的声明。然后到mybutton.cpp文件中,修改如下:

  1. #include "mybutton.h"
  2. #include <QDebug>
  3. MyButton::MyButton(QWidget *parent) :
  4. QPushButton(parent)
  5. {
  6. }
  7. MyButton::~MyButton()
  8. {
  9. qDebug() << "delete button";
  10. }

这里添加了析构函数的定义,这样当MyButton的对象被销毁时,就会输出相应的信息。这里定义析构函数只是为了更清楚地看到部件的销毁过程,其实一般在构建新类时不需要实现析构函数。下面到widget.cpp文件中进行更改,添加头文件

  1. #include<mybutton.h>
  2. #include<QDebug>

在构造函数中添加代码:

  1. MyButton *button = new MyButton(this); // 创建按钮部件,指定widget为父部件
  2. button->setText(tr("button"));

更改析构函数:

  1. Widget::~Widget()
  2. {
  3. delete ui;
  4. qDebug() << "delete widget";
  5. }

Widget类的析构函数中默认已经有了销毁ui的语句,这里又添加了输出语句。当Widget窗口被销毁时,将输出信息。下面运行程序,然后关闭窗口,在Qt Creator的应用程序输出栏中的输出信息为:

  1. delete widget
  2. delete button

可以看到,当关闭窗口后,因为该窗口是顶层窗口,关闭后没有可以显示的窗口,所以应用程序要销毁该窗口部件(如果不是顶层窗口,那么关闭时只是隐藏,不会被销毁),而当窗口部件销毁时会自动销毁其子部件。这也就是在Qt中经常只看到new操作而看不到delete操作的原因。再来看一下main.cpp文件,其中Widget对象是建立在栈上的:

  1. Widget w;
  2. w.show();

这样对于对象w,在关闭程序时会被自动销毁。而对于Widget中的部件,如果是在堆上创建(使用new操作符),那么只要指定Widget为其父窗口(创建时指定parent参数为this)就可以了,也不需要进行delete操作。整个应用程序关闭时,会去销毁w对象,而此时又会自动销毁它的所有子部件,这些都是Qt的对象树所完成的。

所以,对于规范的Qt程序,我们要在main()函数中将主窗口部件创建在栈上,比如“Widget w;”,而不要在堆上进行创建(使用new操作符)。对于其他窗口部件,可以使用new操作符在堆上进行创建,不过一定要指定其父部件,这样就不需要再使用delete操作符来销毁该对象了。

    ·守卫指针即QPointer

    ·动态的对象转换机制

    ·支持创建自定义类型


元对象系统

   提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。基于以下3个条件:

1.该类必须继承自QObject类

2.必须在类的私有声明区声明Q_OBJECT宏

3.元对象编译器Meta-Object Compiler(moc)为QObject的子类实现元对象特性提供必要的代码。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/601085
推荐阅读
相关标签
  

闽ICP备14008679号