如何从函数传递QStandardItemModel?

问题描述 投票:0回答:2

为了在

QTableView
中显示一些数据,我使用一个函数来计算
QStandardItemModel
并将其发送回调用函数。

函数调用:

QStandardItemModel MyModel = computeMyModel();
ui->tV->setModel(&MyModel);

被调用函数

QStandardItemModel computeMyModel()
{
    QStandardItemModel newModel;
    //........... Steps to compute newModel
    return newModel;
}

当我尝试运行代码时出现以下错误。

error C2248: 'QStandardItemModel::QStandardItemModel' : cannot access private member declared in class 'QStandardItemModel'

如何解决这个问题?(如何成功地将 myModel 从一个函数传递到另一个函数而不通过引用调用?)

限制:

  1. 我必须仅在
    computeMyModel()
    函数中计算模型。
  2. 我不喜欢通过引用调用将模型从调用函数传递到
    computeMyModel()
c++ qt qtableview qabstractitemmodel qstandarditemmodel
2个回答
4
投票

试试这个:

QStandardItemModel* computeMyModel()
{
    int counter = 0;
    QStandardItemModel *model = new QStandardItemModel;
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
        {
            counter++;
            QStandardItem *item = new QStandardItem(QString::number(counter));
            model->setItem(i,j,item);
        }
    return model;
}

使用:

QStandardItemModel *model = computeMyModel();

ui->tableView->setModel(model);
更新

不。这将是正常的,因为您分配内存并返回一个指针,您的指针拥有该内存地址,并且它将一直拥有它,直到有东西删除它。为了证明这一点,请参阅此代码片段。正如您所看到的,您在函数中分配内存,返回一个指针,使用该指针设置数据并调用

setModel
。它可以编译并运行。

功能:

QStandardItemModel* computeMyModel()
{
    QStandardItemModel *model = new QStandardItemModel;
    return model;
}

使用

int counter = 0;
QStandardItemModel *model = computeMyModel();

for (int i = 0; i < 3; ++i)
    for (int j = 0; j < 3; ++j)
    {
        counter++;
        QStandardItem *item = new QStandardItem(QString::number(counter));
        model->setItem(i,j,item);
    }
ui->tableView->setModel(model);

0
投票

实现此目的的另一种方法是传递预先创建的模型并通过引用对其进行操作。

不可能返回

QStandardItemModel
,因为它不可访问,并且发回指针不起作用。

功能:

void computeMyModel(QStandardItemModel& model)
{
    for (int i = 0; i < 3; ++i)
       for (int j = 0; j < 3; ++j)
       {
          counter++;
          QStandardItem *item = new QStandardItem(QString::number(counter));
          model.setItem(i,j,item);
       }
}

使用:

QStandardItemModel* model = new QStandardItemModel(0, 0, this);
computeMyModel(*model);
ui->tableView->setModel(model);
© www.soinside.com 2019 - 2024. All rights reserved.