VB
Қаз. 12, 2020, 3:38 Т.Қ.

Подключение делегата к представлению

Qt

Добрый день.
Изучаю документацию по моделям в Qt. Стандартный код для подключения делегата. Но почему-то данные не отображаются. Кто нибудь знает что здесь не так?

Класс SpinBoxDelegate

  1. QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
  2. {
  3. QSpinBox *editor = new QSpinBox(parent);
  4. editor->setMinimum(0);
  5. editor->setMaximum(100);
  6.  
  7. return editor;
  8. }
  9.  
  10. void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
  11. {
  12. int value = index.model()->data(index, Qt::EditRole).toInt();
  13.  
  14. QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
  15. spinBox->setValue(value);
  16. }
  17.  
  18. void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  19. {
  20. QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
  21. spinBox->interpretText();
  22. int value = spinBox->value();
  23.  
  24. model->setData(index, value, Qt::EditRole);
  25. }
  26.  
  27. void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
  28. {
  29. editor->setGeometry(option.rect);
  30. }

Класс MainWindow

  1. MainWindow::MainWindow(QWidget *parent) :
  2. QMainWindow(parent),
  3. ui(new Ui::MainWindow)
  4. {
  5. ui->setupUi(this);
  6. setWindowTitle(QObject::tr("Spin Box Delegate"));
  7.  
  8. QStandardItemModel *model = new QStandardItemModel(4,2,ui->tableView);
  9. ui->tableView->setModel(model);
  10.  
  11. SpinBoxDelegate delegate;
  12. ui->tableView->setItemDelegate(&delegate);
  13.  
  14. for (int row = 0; row < 4; ++row) {
  15. for (int column = 0; column < 2; ++column) {
  16. QModelIndex index = model->index(row, column, QModelIndex());
  17. model->setData(index, QVariant((row+1) * (column+1)));
  18. }
  19. }
  20.  
  21. setCentralWidget(ui->tableView);
  22. }

Если закомментировать строчки

  1. SpinBoxDelegate delegate;
  2. ui->tableView->setItemDelegate(&delegate);

то данные отображаются.

3

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

4
Дмитрий
  • Қаз. 12, 2020, 8:45 Т.Қ.
  • Жауап шешім ретінде белгіленді.

На сколько понял, у вас делегат создается как объект в конструкторе. и по выходу из тела конструктора он грохается. Попробуйте указатель создать.

    VB
    • Қаз. 13, 2020, 2:28 Т.Қ.

    Да, действительно. Решением оказалось создать указатель.

    1. SpinBoxDelegate *delegate = new SpinBoxDelegate();
    2. ui->tableView->setItemDelegate(delegate);

    Но почему грохается? Я же ссылку на значение отправлял.

      ВЖ
      • Қаз. 13, 2020, 4:21 Т.Қ.

      У Вас ссылка на локальный объект, который уничтожается по выходу из конструктора

        Действительно.

          Пікірлер

          Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
          Кіріңіз немесе Тіркеліңіз