Russian Qt Forum
Апрель 19, 2024, 11:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ComboBoxDelegate в tableView: как достать текст из выпадающего списка в таблице?  (Прочитано 11110 раз)
diagnosefiz
Гость
« : Июнь 02, 2017, 13:20 »

Выпадающий список должен появится во второй колонке только в пустой строке после нажати "Add".
Вот я нажимаю на строку в таблице и появляется выпадаюащий список, но, как только осуществляется переход на другую ячейку - появляются числа в comboBoxe (индексы). Как сохранить выбранный текст? И как отобразить выпадающий combobox не по нажатию на строку, а сразу при появлении пустой строки? Делала через делегат. Пишите любые мысли на этот счет.



comboboxdelegate.h

Код:
#include <QWidget>
#include <QStyledItemDelegate>
#include <QComboBox>
#include <QModelIndex>
#include <QObject>
#include <QtSql>
#include <QItemDelegate>

class ComboBoxDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    ComboBoxDelegate(QObject *parent);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
      void setEditorData(QWidget *editor, const QModelIndex &index) const;
      void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
      void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;

};

comboboxdelegate.cpp

Код:
#include "comboboxdelegate.h"
#include <QComboBox>
#include <QSqlQuery>
#include <QDebug>

ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
    :QItemDelegate(parent)
{

}

QWidget *ComboBoxDelegate ::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{

  QComboBox* editor = new QComboBox(parent);
  QSqlQuery q;
  QStringList list;
  q.exec("select typname from pg_type");
//  while(q.next()){
//      QString name = q.value(1).toString();
//      list<<name;
//}
//  editor->addItems(list);

  QSqlRecord rec = q.record();
      while (q.next()) {
          editor->addItem(q.value(0).toString(), q.value(0));
      }

  return editor;
}

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  QString value = index.model()->data(index, Qt::EditRole).toString();
  comboBox->setCurrentIndex(comboBox->findText(value));
  qDebug() << value;
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  model->setData(index, comboBox->currentIndex(), Qt::EditRole);
}

void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
  editor->setGeometry(option.rect);
}

dialog.cpp - здесь добавляется пустая строка и запихивается во вторую колонку ComboBox

Код:
void Dialog::on_pushButton_clicked()
{
    int lastRow = model->rowCount();
    model->insertRow(lastRow);
    model->setData(model->index(lastRow,1),"");
    tableNameColumn->selectRow(lastRow);
    tableNameColumn->setFocus();
    ComboBoxDelegate* delegate = new ComboBoxDelegate(this);
    tableNameColumn->setItemDelegateForColumn(1, delegate);
    for ( int i = 0; i < model->insertRow(lastRow); ++i )
         {
         tableNameColumn->openPersistentEditor(model->index(i, 1) );
         }
    model->submit();
}


« Последнее редактирование: Июнь 02, 2017, 15:25 от diagnosefiz » Записан
GraninDm
Гость
« Ответ #1 : Июнь 02, 2017, 13:26 »

Судя по всему в моделе нужно установить кроме EditRole еще и DisplayRole.
Записан
VPS
Гость
« Ответ #2 : Июнь 02, 2017, 15:32 »

как только осуществляется переход на другую ячейку - появляются числа в comboBoxe (индексы).
Но вы же сами в модель записываете индекс:
Код:
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  model->setData(index, comboBox->currentIndex(), Qt::EditRole);
}
Записан
diagnosefiz
Гость
« Ответ #3 : Июнь 02, 2017, 15:46 »

как только осуществляется переход на другую ячейку - появляются числа в comboBoxe (индексы).
Но вы же сами в модель записываете индекс:
Код:
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  model->setData(index, comboBox->currentIndex(), Qt::EditRole);
}
Подскажите, как записать текст
Записан
GraninDm
Гость
« Ответ #4 : Июнь 02, 2017, 15:57 »

http://www.prog.org.ru/topic_29216_0.html
Записан
titan83
Гость
« Ответ #5 : Июнь 02, 2017, 19:51 »

как только осуществляется переход на другую ячейку - появляются числа в comboBoxe (индексы).
Но вы же сами в модель записываете индекс:
Код:
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  model->setData(index, comboBox->currentIndex(), Qt::EditRole);
}
Подскажите, как записать текст
model->setData(index, static_cast<QComboBox*>(editor)->currentText(), Qt::EditRole);
Записан
diagnosefiz
Гость
« Ответ #6 : Июнь 03, 2017, 13:54 »

как только осуществляется переход на другую ячейку - появляются числа в comboBoxe (индексы).
Но вы же сами в модель записываете индекс:
Код:
void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
  QComboBox *comboBox = static_cast<QComboBox*>(editor);
  model->setData(index, comboBox->currentIndex(), Qt::EditRole);
}
Подскажите, как записать текст
model->setData(index, static_cast<QComboBox*>(editor)->currentText(), Qt::EditRole);
спасибо. я сделала через ссылки на указатели, чтобы можно было получать текст в другом классе
Записан
VPS
Гость
« Ответ #7 : Июнь 03, 2017, 16:29 »

Заметил, что при каждом нажатии кнопки, Вы постоянно создаёте новый делегат и назначаете его колонке. В этом нет смысла - на мой взгляд лучше поместить его в конструкторе диалога.
Записан
diagnosefiz
Гость
« Ответ #8 : Июнь 06, 2017, 16:05 »

Заметил, что при каждом нажатии кнопки, Вы постоянно создаёте новый делегат и назначаете его колонке. В этом нет смысла - на мой взгляд лучше поместить его в конструкторе диалога.
Я тоже так думаю. Вы не подскажете, как отображать comboBox с тем значением, которое выбрано в модели? исходя из моих скринов, у первого элемента значение "character varying". как его можно отобразить по умолчанию?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 20.