VB
12 октября 2020 г. 15: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 г. 20:45
  • Ответ был помечен как решение.

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

    VB
    • 13 октября 2020 г. 14:28

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

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

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

      ВЖ
      • 13 октября 2020 г. 16:21

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

        VB
        • 13 октября 2020 г. 16:58

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

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          • Последние комментарии
          • IscanderChe
            12 апреля 2025 г. 17:12
            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
          • AK
            1 апреля 2025 г. 11:41
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            9 марта 2025 г. 21:02
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            9 марта 2025 г. 16:14
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            22 ноября 2024 г. 21:51
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…