QTableView добавлен в конструктор: не отображаются данные

#qt #qtableview

#qt #qtableview

Вопрос:

Я нашел пример, как использовать QTableView : http://doc.trolltech.com/4.5/sql-querymodel.html Это работает нормально. Данные отображаются в QTableView .

Но QTableView в этом примере создается динамически в main.cpp файле. В моем приложении у меня есть основная форма, и я добавил QTableView в designer. Я пытаюсь заполнить это QTableView в конструкторе, но без результата:

 MainApplication::MainApplication(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainApplication)
{
    ui->setupUi(this);


    QMap<QString, double> currencyMap;
        currencyMap.insert("AUD", 1.3259);
        currencyMap.insert("CHF", 1.2970);
        currencyMap.insert("CZK", 24.510);


        CurrencyModel currencyModel;
        currencyModel.setCurrencyMap(currencyMap);

      ui->tableView_currencies->setModel(amp;currencyModel);
      ui->tableView_currencies->setAlternatingRowColors(true);

      ui->tableView_currencies->setWindowTitle(QObject::tr("Currencies"));
      ui->tableView_currencies->show();

}
  

QTableView отображается в основной форме пустым, видны только заголовки столбцов и строк. И данные не отображаются.

Кто-нибудь знает сайт с примерами, где в designer добавляются такие компоненты, как QTableView , QListView ? В руководствах trolltech (nokia) все компоненты создаются динамически.

Ответ №1:

Модель больше не действительна после выполнения конструктора!
Вы создаете локальный объект currencyModel , который будет уничтожен, когда он выйдет за пределы области видимости (в конце c’tor’а), но передаете указатель на него в качестве модели для табличного представления!
Табличное представление не копирует данную модель вглубь и фактически даже не становится владельцем переданного указателя:

Представление не становится владельцем модели, если только оно не является родительским объектом модели, поскольку представление может быть общим для многих разных представлений. (Документ QTableView)

Вы должны просто выделить модель без кучи (используя new ) и установить представление в качестве родительского объекта. таким образом, табличное представление также обработает его удаление:

 CurrencyModel *currencyModel = new CurrencyModel(ui->tableView_currencies);
  

Ответ №2:

Я с большим успехом использовал QTableWidget вместо QTableView в designer.

Если вы действительно хотите понять, почему * View не работают, в то время как * виджеты работают, вам следует использовать designer / moc для создания кода и сравнения их друг с другом, а затем сравнить с примерами рабочего * View. Лично я был удовлетворен, когда * Типы виджетов работали, поэтому я прекратил поиск; * Виджет наследуется от * View.

Комментарии:

1. Хорошо, но что с реализацией модели / представления.

Ответ №3:

Я встретил и у вас тот же вопрос, king_nak прав, ваша currencyModel — это временные переменные;

 QxCurrencyModel* currencyModel = new QxCurrencyModel;