Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中从QabStretctTableModel初始化数据到自定义模型?_C++_Qt - Fatal编程技术网

C++ 在Qt中从QabStretctTableModel初始化数据到自定义模型?

C++ 在Qt中从QabStretctTableModel初始化数据到自定义模型?,c++,qt,C++,Qt,我是Qt模型/视图框架的初学者。 在QTableView中使用QAbstractTableModel子类(MyModel)时遇到问题。 创建MyModel对象后,我希望将其设置为具有2行和2列。 我有一个initialise函数,它设置所有的类变量&然后发出dataChanged()信号,但视图仍然没有显示任何内容 class MyModel : QAbstractTableModel { public: MyModel(); Initialise(doub

我是Qt模型/视图框架的初学者。 在QTableView中使用QAbstractTableModel子类(MyModel)时遇到问题。 创建MyModel对象后,我希望将其设置为具有2行和2列。 我有一个initialise函数,它设置所有的类变量&然后发出dataChanged()信号,但视图仍然没有显示任何内容

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));
}
我已经重新实现了只读访问所需的所有功能。 但我还是得到了一个空白的窗口。 在记事本中创建上述代码用于演示,因此请忽略语法错误。 我在QtSDK中找不到任何从QabStretctTableModel创建自定义模型的示例。 因此,请让我知道什么是将数据初始化到模型中的正确方法

编辑:

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

要初始化表中的数据,必须重新定义数据函数、行计数和丛计数以及模型的构造函数。 假设您有在构造函数中初始化的数据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
}
在initialize函数中,实际上您可以使用该函数进行修改,但如果行和列超过初始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);
}

请参阅进一步的

要初始化表中的数据,您必须重新定义数据函数、行计数和丛计数以及模型的构造函数。 假设您有在构造函数中初始化的数据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
}
在initialize函数中,实际上您可以使用该函数进行修改,但如果行和列超过初始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);
}

有关详细信息,请参阅

数据更改
信号强制视图更新现有项。它不会告诉它行或列计数已更改。您应该改用
layoutboutbechanged
layoutChanged
信号。您可以不使用任何参数就使用它们

确保正确实现了
rowCount
columnCount
虚拟函数

我不知道为什么
index.isValid()
在函数中为false。检查索引的
model()
row()
column()
属性,找出其无效的确切原因。通常,视图可以使用任意参数调用
data
函数。因为视图认为模型为空,所以所有索引很可能都无效。当您在视图中看到任何行和列时,您将开始接收有效的索引

此外,如果只执行一次初始化,则最好在将模型指定给视图之前执行初始化


不要使用
double**
。改用自动内存管理(例如
QVector
)。毕竟是C++,

<代码>数据更新< /代码>信号强制视图更新现有项。它不会告诉它行或列计数已更改。您应该改用
layoutboutbechanged
layoutChanged
信号。您可以不使用任何参数就使用它们

确保正确实现了
rowCount
columnCount
虚拟函数

我不知道为什么
index.isValid()
在函数中为false。检查索引的
model()
row()
column()
属性,找出其无效的确切原因。通常,视图可以使用任意参数调用
data
函数。因为视图认为模型为空,所以所有索引很可能都无效。当您在视图中看到任何行和列时,您将开始接收有效的索引

此外,如果只执行一次初始化,则最好在将模型指定给视图之前执行初始化


不要使用
double**
。改用自动内存管理(例如
QVector
)。它是C++,毕竟,

AFAIK::DATA()被QTable视图调用,以显示每个单元格的数据。但当我在::data()内的第一行中调用index.isValid()时,它返回false。这就是为什么它没有显示任何内容。因此,我认为我的初始化方法遗漏了一些东西。可能和索引有关。您显示的::data()与我的有点类似,只是还有一些检查。它在第一行返回,因为索引无效…编辑了问题,请让我知道这是否消除了混淆。是的,我确实提到了那个链接。但正如你在上面看到的,我得到了无效的索引。我不明白为什么。我不明白在MyModel中重新创建数组对我有什么帮助,不过我会尝试&让你知道。另外,如果我通过调试发现索引的模型指针为空,行和列的值也为0,那么这也有帮助。您最初是否将行和列设置为零?请再次检查代码我删除了重新创建数据的愚蠢错误。QTableView调用AFAIK::data()来显示每个单元格的数据。但当我在::data()内的第一行中调用index.isValid()时,它返回false。这就是为什么它没有显示任何内容。因此,我认为我的初始化方法遗漏了一些东西。可能和索引有关。您显示的::data()与我的有点类似,只是还有一些检查。它在第一行返回,因为索引无效…编辑了问题,请让我知道这是否消除了混淆。是的,我确实提到了那个链接。但正如你在上面看到的,我得到了无效的索引。我不明白为什么。我不明白在MyModel中重新创建数组对我有什么帮助,不过我会尝试&让你知道。另外,如果通过调试我发现索引的model指针为空,那么行和列的值也为0。您最初是否设置了行和列的值