繁体   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