Как передать QStandardItemModel из функции?

Чтобы отобразить некоторые данные в 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() через вызов по ссылке.

person Sathish    schedule 16.09.2014    source источник
comment
QStandardItemModel наследуется от QObject, поэтому вы не можете использовать его конструктор копирования (помеченный как закрытый в QObject). Выделите его в куче и передайте по указателю на свои функции   -  person epsilon    schedule 16.09.2014


Ответы (1)


Попробуй это:

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);
person Kosovan    schedule 16.09.2014
comment
привет @Chernobyl, он работает как положено. Но у меня есть другое сомнение. Поскольку я передаю указатель на QStandardItemModel из функции computeMyModel(), не выйдет ли указатель за пределы области видимости, как только функция выйдет из области видимости? Указатель QstandardItemModel model объявлен внутри функции! - person Sathish; 17.09.2014
comment
спасибо за объяснение распределения памяти указателя. Я проголосовал за ваш ответ - person Sathish; 18.09.2014