2013-07-10 76 views
0

的文件似乎說這個插孔,我已經看到了一堆周圍的StackOverflow等地曖昧的示例代碼,所以......Qt信號轉發;繼承QAbstractProxyModel

如果我有一個類A實現了一個QAbstractProxyModel和類B,實現QAbstractItemModel,我呼籲A方法的實例setSourceModel(b)其中bB的實例,是否會自動照顧轉發更新信號,如modelReset,rowsInserted等。或者我必須手動連接所有這些?

回答

0

如果類似class A : public QAbstractProxyModelclass B : public QAbstractItemModel那麼信號和時隙也應該被繼承。 (除非你想

它特殊的行爲如果「QAbstractClasses」是A簡單成員和B你有「前進」他們

+0

該信號被繼承,並不意味着他們將正常工作的事實。例如,如果您子類'QAbstractItemModel',則必須在'setData'方法實現中發出'dataChanged'信號。 –

0

從文檔:

要繼承QAbstractProxyModel,你需要實現mapFromSource()和mapToSource()。如果你需要一個不同於默認行爲的行爲,mapSelectionFromSource()和mapSelectionToSource()函數只需要重新實現。

沒有關於信號的詞。所以它在所提到的方法的文檔中。這意味着你不需要關心信號,它們會自動發射。

1

如果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; 
} 

...