使用 QObject 属性的指针

Posted

技术标签:

【中文标题】使用 QObject 属性的指针【英文标题】:Using pointers for QObject attributes 【发布时间】:2013-01-02 18:47:54 【问题描述】:

自从我学习 Qt 以来,我一直对以下事实感到困惑:在我阅读的文档和书籍中,它们使用指针来表示作为 QObject 子类实例的属性,例如小部件。

我知道 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 文件中包含标题,这会是使用指针的原因吗?

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

【问题讨论】:

为什么你觉得你应该避免指针? 【参考方案1】:

这里似乎对同一个问题进行了相当长的讨论:Class member: pointer or variable?

此链接中的一些观点谈论:

长寿命对象与短寿命对象 堆与栈 根据在对象上设置的父级保证析构函数的顺序

似乎这里的要点是没有硬性规定,而是逐案处理。由于我目前也在从 PyQt -> Qt 迁移并开始使用我的 C++,因此到目前为止,我的有限观点是我总是将指针用于作为 QObject 子类的类成员。我只是觉得我知道它们只会被 Qt 父级->子级销毁过程销毁。

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

【讨论】:

感谢您的链接。我已经明白,如果我们要将它们的父对象从包含对象更改为另一个对象,则创建 QObject 成员变量可能是不安全的,因为它将被删除并且父对象将有一个 NULL 指针。因此使用起来更安全指针,因为它们被父母删除了。 是的。我的想法是,如果它要成为成员对象,那么父对象应该是带有最终将类作为父对象的容器的东西。除非是特殊情况,它持有指向其他对象的指针,在这种情况下,应该明确不取得所有权(设置为父对象)【参考方案2】:

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

【讨论】:

感谢您的回答,但是如何使用成员变量而不是指针来防止将我们限制为默认构造函数

以上是关于使用 QObject 属性的指针的主要内容,如果未能解决你的问题,请参考以下文章

将 QObject 指针从 QML 对象传递给 C++

在 QObject 派生类的构造函数中使用 deleteLater

Qt Qml连接到Context属性的QObject属性的信号

Qt:将指针传递给 QMimeData 中的 QObject

是否可以为 QObject 的父级使用共享指针?

在 QMap 中插入 QObject * - 无法初始化或传递指针