簡體   English   中英

將數據從Qt中的QAbstractTableModel初始化為自定義模型?

[英]Initialising data into custom model from QAbstractTableModel in Qt?

我是Qt的模型/視圖框架的初學者。 我在將QAbstractTableModel子類(MyModel)與QTableView一起使用時遇到麻煩。 創建MyModel對象后,我想將其設置為2行2列。 我有一個初始化函數,該函數設置所有類變量,然后發出dataChanged()SIGNAL,但視圖仍未顯示任何內容。

class MyModel : QAbstractTableModel
{
     public:
       MyModel();
       Initialise(double **a, int r, int c);

     private:
       int row;
       int column;
       double **array;
}

MyModel::Initialise(double **a, int r, int c)
{
     array = a;
     row = r;
     column = c;
     emit dataChanged(index(0, 0), index(r - 1, c - 1));
}

我已經重新實現了只讀訪問所需的所有功能。 但是我仍然得到一個空白的窗口。 在記事本中創建了以上代碼以用於說明,因此請忽略語法錯誤。 我在Qt SDK中找不到用於從QAbstractTableModel創建自定義模型的任何示例。 因此,請讓我知道將數據初始化為模型的正確方法是什么。

編輯:

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();//currently it is returning from here, why???

    switch(role)
    {
        case Qt::DisplayRole:
        {
        if(index.column()==0)
            return QString::number(array[index.row()][index.column()]);
        break;
        }
    }
}

dataChanged信號強制視圖更新現有項。 它不會告訴它行數或列數已更改。 您應該改用layoutAboutToBeChangedlayoutChanged信號。 您可以不帶任何參數地使用它們。

確保正確實現了rowCountcolumnCount虛擬函數。

我不知道為什么index.isValid()在您的函數中為false。 檢查索引的model()row()column()屬性以找出為什么它完全無效。 通常,視圖可以使用任意參數調用data函數。 由於您的視圖認為您的模型為空,因此所有索引很可能無效。 當您在視圖中看到任何行和列時,您將開始接收有效的索引。

同樣,如果初始化僅執行一次,則最好在將模型分配給視圖之前進行初始化。

並且不要使用double** 而是使用自動內存管理(例如QVector )。 畢竟是C ++。

要在Table中初始化數據,您必須重新定義數據函數,rowCount和clumnCount以及Model的構造函數。 假設您有在構造函數中初始化的數據int mydataarray [r] [c]。

   TableModel::TableModel(int r,int c, double **initialdata)
{
    R = r;
    C = c;
    mydataarray= initialdata;
}

QVariant TableModel::data(const QModelIndex &index, int role) const
{
    switch(role)
    {
    case Qt::DisplayRole:
        if(index.column()==0)
        {
        return QString::number(maydataarray[index.row()][index.column()]);
        }
        break;
}

設置行數和列數重新定義

int TableModel::rowCount(const QModelIndex &parent= QModelIndex()) const
{
    return R;//R is number of initial rows
}

int TableModel::columnCount(const QModelIndex &parent= QModelIndex()) const
{
    return C;//C is number of initial columns
}

在初始化函數中,實際上您可以使用它進行修改,但是如果它們超出了初始r和c,則必須在模型中插入行和列

    void TableModel::Initialize(double **a, int r, int c)
    {
    QModelIndex m = createIndex(0,0);

    if(r>this->rowCount(m)||c>this->columnCount(m))
    {
        QMessageBox m1;
        m1.setText("Exciding r/c "+ QString::number(m.row())+QString::number(m.column()));
        m1.exec();
        return;//add logic to insert exceeding rows and columns here before calling dataChange() function
    }

  mydataarray =a;

    QModelIndex n = createIndex(r-1,c-1);
    this->dataChanged(createIndex(0,0),n);
}

參照作進一步

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM