自从我学习 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/