为QObject属性使用指针
Using pointers for QObject attributes
自从我学习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程序员。
也许只是使用一个不同于默认构造函数的构造函数?
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 重新检查时指针属性会更改
- 返回的指针属性中类实例上的矢量属性消失
- boost::spirit指针属性是用nullptr初始化的吗?
- 如何使用指针从另一个类访问属性
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 使用智能指针属性创建资源库函数?
- 通过指针算法调用结构的结构属性
- C++对象共享属性 - 使用指针或引用
- C++ 使用成员函数返回结构体指针属性的值
- 指向结构的指针保留某些属性,同时将其他属性重置为零(使用 map)
- 当我初始化了指针属性 allready 时,如何将 QGraphicsItem 向下投射到创建的类?
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 如果使用类的指针属性来访问堆,如何避免非标量类型的错误
- C++引用基类中的子类指针属性
- 返回泛型函数中对象的引用(具有指针或非指针属性)
- 用静态数组覆盖指针属性
- 如何将指向类的指针属性的指针作为双指针传递?
- 如何使用非指针属性的析构函数