的文件似乎說這個插孔,我已經看到了一堆周圍的StackOverflow等地曖昧的示例代碼,所以......Qt信號轉發;繼承QAbstractProxyModel
如果我有一個類A
實現了一個QAbstractProxyModel
和類B
,實現QAbstractItemModel
,我呼籲A
方法的實例setSourceModel(b)
其中b
是B
的實例,是否會自動照顧轉發更新信號,如modelReset
,rowsInserted
等。或者我必須手動連接所有這些?
的文件似乎說這個插孔,我已經看到了一堆周圍的StackOverflow等地曖昧的示例代碼,所以......Qt信號轉發;繼承QAbstractProxyModel
如果我有一個類A
實現了一個QAbstractProxyModel
和類B
,實現QAbstractItemModel
,我呼籲A
方法的實例setSourceModel(b)
其中b
是B
的實例,是否會自動照顧轉發更新信號,如modelReset
,rowsInserted
等。或者我必須手動連接所有這些?
如果類似class A : public QAbstractProxyModel
和class B : public QAbstractItemModel
那麼信號和時隙也應該被繼承。 (除非你想
它特殊的行爲如果「QAbstractClasses」是A
簡單成員和B
你有「前進」他們
從文檔:
要繼承QAbstractProxyModel,你需要實現mapFromSource()和mapToSource()。如果你需要一個不同於默認行爲的行爲,mapSelectionFromSource()和mapSelectionToSource()函數只需要重新實現。
沒有關於信號的詞。所以它在所提到的方法的文檔中。這意味着你不需要關心信號,它們會自動發射。
如果class A : public QAbstractProxyModel
,class B : public QAbstractItemModel
某些信號轉發和更新良好(dataChanged
等)。但有些(如rowsInserted
)需要手動更正。
我用這樣的代碼:
...
#define COL_ID 0
void A::setSourceModel(QAbstractItemModel *newSourceModel) {
beginResetModel();
if (this->sourceModel()) { // disconnect sourceModel signals
...
}
...
QAbstractProxyModel::setSourceModel(newSourceModel);
if (this->sourceModel()) { // connect sourceModel signals
...
connect(this->sourceModel(), SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(sourceRowsInserted(QModelIndex, int, int)));
...
}
return;
}
...
void A::sourceRowsInserted(const QModelIndex &parent, int first, int last) {
QModelIndex parentIndex = this->mapFromSource(parent);
QModelIndex sourceTopIndex = this->sourceModel()->index(first, COL_ID, parent);
QModelIndex sourceBottomIndex = this->sourceModel()->index(last, COL_ID, parent);
QModelIndex topIndex = this->mapFromSource(sourceTopIndex);
QModelIndex bottomIndex = this->mapFromSource(sourceBottomIndex);
beginInsertRows(parentIndex, topIndex.row(), bottomIndex.row());
endInsertRows();
return;
}
...
該信號被繼承,並不意味着他們將正常工作的事實。例如,如果您子類'QAbstractItemModel',則必須在'setData'方法實現中發出'dataChanged'信號。 –