#qt
#qt
Вопрос:
PrintIntervalTableModel
реализует QAbstractTableModel
1) Должен ли я назначать родительский элемент во время создания?
PrintIntervalTableModel * model = new PrintIntervalTableModel(dataset, this);
ui.table->setModel(model);
или
2) Устанавливает ли setModel
вызов родительский элемент модели для представления?
// Do not pass in a parent widget during construction...
// I have seen this in examples. Is it wrong, right, or a shaky practice?
PrintIntervalTableModel * model = new PrintIntervalTableModel(dataset);
ui.table->setModel(model);
Если # 2 является приемлемым или даже предпочтительным, как мы узнаем, какие вызовы функций назначают виджеты родителям, а какие нет? Кажется опасным просто предполагать, что вызов типа setModel
управляет дочерней памятью, если у нас нет объективных доказательств того, что это так.
Ответ №1:
Вот что void QAbstractItemView::setModel(QAbstractItemModel *model)
говорит:
Представление не становится владельцем модели, если только оно не является родительским объектом модели, потому что модель может совместно использоваться многими различными представлениями.
Таким образом, представление не является родительским для вашей модели, использующей setModel(...)
функцию.
Когда вы пишете PrintIntervalTableModel * model = new PrintIntervalTableModel(dataset, this);
это относится к классу, в котором вы пишете свой код, поэтому нет ссылки на представление (в вашем примере).
Чтобы определить родительский объект, вы можете либо поместить this
в конструктор, либо вызвать функцию void QObject::setParent(QObject *parent)
, я не думаю, что есть какой-либо другой способ сделать это.