4

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

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

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

小部件.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 上看到了一些类似的问题,但答案是小部件应该存在于函数调用之间,但是当将它们用作属性时,这是在这里实现的。

4

2 回答 2

5

这里似乎对同一个问题进行了相当长的讨论:
类成员:指针还是变量?

此链接中的一些要点谈到:

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

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

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

于 2013-01-02T19:14:53.003 回答
0

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

于 2013-01-02T18:58:09.987 回答