2014-09-16 2 views
1

Чтобы отобразить некоторые данные в QTableView, я использую функцию для вычисления QStandardItemModel и отправил ее обратно вызывающей функции.Как передать 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() через вызов по ссылке.
+3

QStandardItemModel унаследован от QObject, так что вы не можете использовать его конструктор копирования (помечено как частное в QObject). Выделите его в куче и передайте его указателем на свои функции. – jbh

ответ

3

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

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

Update.

Нет. Это будет нормально, потому что вы выделяете память и указатель возврата, ваш указатель имеет этот адрес памяти, и он будет иметь его, пока что-то не удалит его. Чтобы доказать это, см. Этот фрагмент кода. Как вы можете видеть, вы выделяете память в функции, возвращаете указатель, задаете данные с помощью этого указателя и вызываете 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 из функции 'computeMyModel()', не будет ли указатель выйти из области действия, как только функция выходит за пределы области видимости? В функции объявляется указатель 'model' QstandardItemModel внутри этой функции! – Sathish

+0

@Sathish см. Мое редактирование, пожалуйста. – Chernobyl

+0

@ Сатиш, пожалуйста, спасибо. – Chernobyl

Смежные вопросы