c++ - 使用 QObject 属性的指针

标签 c++ qt pointers qobject

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

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

最佳答案

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

此链接中的一些要点是:

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

这里的要点似乎是没有硬性规定,而是视具体情况而定。由于我目前也在从 PyQt -> Qt 迁移并选择我的 C++,所以到目前为止我的有限意见是我总是对作为 QObject 子类的类成员使用指针。我只是觉得我知道它们只会被 Qt parent->child destruction process 销毁。

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

关于c++ - 使用 QObject 属性的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14127438/

相关文章:

C++:从函数、返回类型或引用中使用和返回字符数组?

python - py2exe 可执行文件未正确刷新标准输出

C++ 错误 : no matching function call from pointer to pointer reference using Qt and QVariant

c++ - 继承构造函数和默认构造函数

c++ - 我用STL写了一个bin_search,不过这是个小BUG

c++ - QML 使用带参数的 C++ 函数

C++ 将 const char* 转换为 char*

c - C 中的指针 - 一维和二维

c++ - 检查蓝牙套接字中缓冲区的状态

c++ - 使用动态内存 C++ 移动指针