С тех пор как я изучил Qt, меня смутил тот факт, что в документациях и книгах, которые я читал, они используют указатели для атрибутов, которые являются экземплярами подклассов QObject, таких как виджеты.
Я знаю, что объекты QObject удаляют своих детей, но не следует ли нам избегать использования указателей, кроме случаев, когда это действительно необходимо?
Вот рабочий пример, в котором я не использую указатели:
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, но ответ был таков: виджеты должны жить между вызовами функций, но это достигается здесь, когда они используются в качестве атрибутов.
Похоже, здесь идет довольно длительное обсуждение этого же вопроса:
Член класса: указатель или переменная?
Некоторые из пунктов этой ссылки говорят о:
Похоже, что отсюда дело не в жестком и быстром правиле, а в каждом конкретном случае. Поскольку в настоящее время я также перехожу из PyQt -> Qt и собираю свой C ++, мое ограниченное мнение до сих пор состоит в том, что я всегда использую указатели для членов класса, которые являются подклассами QObject. Я просто чувствую, что знаю, что они будут уничтожены только процессом уничтожения Qt parent-> child.
Опять же, это ограниченная перспектива. Я уверен, что кто-то с большим опытом C ++ может предложить лучший ответ. Но ссылка, на которую я ссылался, включает в себя очень опытных программистов на Qt.
Может быть, просто использовать конструктор, отличный от конструктора по умолчанию?