2014-07-04 172 views
2

我實現QAbstractTableModel與通常的:QAbstractTableModel :: insertRows()的基本用法

class PrintIntervalTableModel : public QAbstractTableModel 
{ 
private: 
    virtual int rowCount (const QModelIndex & parent = QModelIndex()) const; 
    virtual int columnCount (const QModelIndex & parent = QModelIndex()) const; 
    virtual QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const; 
    virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; 
    virtual bool setData (const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); 
    virtual Qt::ItemFlags flags (const QModelIndex & index) const; 

    virtual bool insertRows (int position, int rows, const QModelIndex & parent = QModelIndex()); 
    virtual bool removeRows (int position, int rows, const QModelIndex & parent = QModelIndex()); 

這裏是我的插入行,這是非常簡單的:

bool PrintIntervalTableModel::insertRows(int position, int rows, const QModelIndex & parent) 
{ 
    beginInsertRows(QModelIndex(), position, position + rows - 1); 

    for (int row = 0; row < rows; ++row) 
    { 
    std::deque<moment_value_pair_type>::iterator it = printIntervalPairs.begin() + position; 
    printIntervalPairs.insert(it, moment_value_pair_type()); 
    } 

    endInsertRows(); 

    return true; 
} 

現在我不知道爲什麼我居然做過這個?視圖(或其他組件)是否自動調用此方法?

我想在窗體上有一個按鈕,一旦點擊就在用戶的當前選擇下插入一行。我是否基本上在表中創建一個插槽(連接到按鈕clicked()),它計算出插入行的位置,然後該插槽將調用table-> insertRows()?這是insertRows()覆蓋用於的目的類型嗎?

回答

2

有點晚了,但不管怎麼說:

現在我不知道爲什麼我竟然這樣做?視圖(或其他組件)是否自動調用此方法?

是,insertRows()由默認實現QAbstractItemModel::dropMimeData(),當從另一個Qt的視圖物品掉到那裏都會調用調用。

同樣,removeRows()由默認實現QAbstractItemView::startDrag()調用。

我在源代碼中找不到其他用法。

2

難道我基本上是在表中創建一個插槽(連接按鈕 點擊()),其計算出在哪裏插入行,然後插槽 將調用表 - > insertRows()?這是用於insertRows()重寫的 用途的類型?

是(通過QAbstractItemModel接口,視圖使用該視圖)。 你可以看看QTableWidget的源代碼作爲例子。

void QTableWidget::insertRow(int row) 
{ 
    Q_D(QTableWidget); 
    d->tableModel()->insertRows(row); 
} 

你會發現(H文件)的insertRow這裏是一個槽(由一個選擇模型信號的裝置 通常通知它)。然後它調用insertRows(你已經覆蓋的 函數)。一個典型的實現可以在 來源中找到:

bool QTableModel::insertRows(int row, int count, const QModelIndex &) 
{ 
    if (count < 1 || row < 0 || row > verticalHeaderItems.count()) 
     return false; 

    beginInsertRows(QModelIndex(), row, row + count - 1); 
    int rc = verticalHeaderItems.count(); 
    int cc = horizontalHeaderItems.count(); 
    verticalHeaderItems.insert(row, count, 0); 
    if (rc == 0) 
     tableItems.resize(cc * count); 
    else 
     tableItems.insert(tableIndex(row, 0), cc * count, 0); 
    endInsertRows(); 
    return true; 
}