QTableView добавлен в конструктор: данные не отображаются - PullRequest
2 голосов
/ 27 мая 2011

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

Но QTableView в этом примере динамически создается в файле main.cpp.В моем приложении есть основная форма, и я добавил QTableView в конструктор.Я пытаюсь заполнить этот 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(&currencyModel);
      ui->tableView_currencies->setAlternatingRowColors(true);

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

}

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

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

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

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

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

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

0 голосов
/ 24 февраля 2012

Я встречался, и вы задали тот же вопрос, что king_nak прав: ваша currencyModel - это временные переменные;

0 голосов
/ 27 мая 2011

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

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

...