VB
Oct. 12, 2020, 3:38 p.m.

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

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

Do you like it? Share on social networks!

4
Дмитрий
  • Oct. 12, 2020, 8:45 p.m.
  • The answer was marked as a solution.

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

    VB
    • Oct. 13, 2020, 2:28 p.m.

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

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

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

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

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

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          • Last comments
          • AK
            April 1, 2025, 11:41 a.m.
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            March 9, 2025, 9:02 p.m.
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            March 9, 2025, 4:14 p.m.
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            Nov. 22, 2024, 9:51 p.m.
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          • Evgenii Legotckoi
            Oct. 31, 2024, 11:37 p.m.
            Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup