为QObject属性使用指针

Using pointers for QObject attributes

本文关键字:指针 属性 QObject      更新时间:2023-10-16

自从我学习Qt以来,我一直被这样一个事实所迷惑,即在我读过的文档和书籍中,它们使用指针作为QObject子类的实例的属性,例如widgets。

我知道QObjects会删除它们的子对象,但是我们不应该避免使用指针,除非真的有必要吗?

这里是一个我不使用指针的工作示例:

Widget.h文件:

#include <QSlider>
#include <QLabel>
#include <QVBoxLayout>
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
public slots:
    void change(int);
private:
    QSlider m_slider;
    QLabel m_label;
    QVBoxLayout m_layout;
};

和Widget.cpp文件:

#include "Widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , m_slider(Qt::Horizontal)
    , m_label("0")
    , m_layout(this)
{
    m_layout.addWidget(&m_slider);
    m_layout.addWidget(&m_label);
    connect(&m_slider, SIGNAL(valueChanged(int)), this, SLOT(change(int)));
}
void Widget::change(int n){
    m_label.setText(QString::number(n));
}

这里唯一的区别是我必须在Widget.h文件中包含头文件,这是使用指针的原因吗?

我想补充的是,我在StackOverflow上看到过一些类似的问题,但答案是小部件应该在函数调用之间存在,但这是在这里使用它们作为属性时实现的。

关于这个问题似乎有一个相当长的讨论:
类成员:指针还是变量?

这个链接的一些要点讨论:

  • 长寿命对象与短寿命对象
  • 堆vs堆栈
  • 基于对象上设置的父类的析构函数的保证顺序

这里的要点似乎是没有一个硬性规定,而是一个具体情况具体分析的基础。由于我目前也从PyQt -> Qt迁移到我的c++,到目前为止,我有限的意见是我总是使用指针作为QObject子类的类成员。我只是觉得我知道它们只会被Qt父->子销毁过程销毁。

同样,这是一个有限的视角。我相信有丰富c++经验的人可以提供更好的答案。但是我提到的链接确实包括非常有经验的Qt程序员。

也许只是使用一个不同于默认构造函数的构造函数?