2014-03-06 59 views
0

我正在Qt 4.7中工作。我有一個類是QAbstractTableModel的子類。我需要一個名爲intlist的本地QList來跟蹤標題是特定值的任何列。這些頭文件存儲在名爲headerNames的QStringList中。現在,我有這樣的:Qt - 如何從const函數追加到本地列表

QVariant myTableClass::data(const QModelIndex &index, int role) const 
{ 
    if(headerNames[index.column()] == "TriggerText") 
    { 
    this->intlist.append(index.column(); 
    } 
    return QVariant; 
} 

當我嘗試建立這個,它給我的錯誤「C2663:‘的QList ::追加’:2個重載有this指針沒有法律的轉換」。我嘗試了幾種不同的方式,基於我在網上找到的類似問題給出的提示,包括:使用intlist而不是this-> intlist;將int設置爲index.column()的值,然後在append中使用該int;並創建一個單獨的非const函數來調用它來追加值。他們都給出了同樣的錯誤。我完全不知道該怎麼做。任何人都可以幫忙嗎?謝謝!

+0

聲明'intlist'成員'mutable',你應該可以在'const'函數內修改它。 – Steve

+0

請注意,您的代碼會跟蹤任何* access *觸發列。這是你想要做的嗎? 'return'語句無效,請包含有效的代碼以避免混淆實際問題。 – hyde

+0

請注意,您是從Qt API繼承方法的完全偏離,以完全偏離該方法supposd做。如果你的代碼行爲不當,我不會感到驚訝。 – UmNyobe

回答

0

如果您絕對需要修改const成員函數中的成員,則可以將mutable添加到要修改的成員的聲明中。

成員應該可能是私人的,並且該成員的狀態不應影響公開給您班級的用戶的公開狀態,他們期望您的成員函數對該對象沒有任何影響。

參見this page on MSDN,或者可能是由Bjarne Stroustrup的The C++ Programming Language Fourth Edition的第16.2.9.3節。在C++ 11之前有mutable

+0

mutable似乎比使用const_cast +1更好 – paulm

0

所有其他答案錯過了真正的問題:跟蹤const訪問器方法中的更改絕對沒有意義。即使它是一種代理模式,它也沒有意義。

您應該更新intlist,無論您的標頭名稱是否更改。例如,假設m_headerNames反映到模型的外部可見的頭名:

class MyModel : public QAbstractTableModel { 
    QList<int> m_intlist; 
    QList<QString> m_headerNames; 
    Q_SLOT void trackHeaderData() { 
    m_intList.clear(); 
    for (int i = 0; i < m_headerNames.size(); ++i) { 
     if (m_headerNames[i] == QStringLiteral("TriggerText")) 
     m_intList << i; 
    } 
    } 
public: 
    MyModel(...) { 
    connect(this, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), 
        SLOT(trackHeaderData())); 
    } 
}; 

當然,如果你沒有正確發出headerDataChanged信號,這將不起作用;如果你不這樣做,那麼你的模型就會被打破。

+0

不確定初衷是什麼,但問題* code *不跟蹤更改,它跟蹤訪問。 – hyde

+0

@hyde跟蹤對'headerNames'的更改,但是在const訪問器方法中這樣做。這些'headerNames'在其他地方發生了變化,這就是跟蹤代碼所屬的地方,或者至少如我在與通知信號相關的插槽中顯示的一樣。 –