(Qt) Создание делегата в выпадающем списке в качестве опций целого столбца модели

0

Ну, этот вопрос может быть сделан из-за моего плохого понимания работы делегатов.

Использование структуры модели/представления. До сих пор я сделал несколько делегированных делегатов, но сейчас мне нужно получить делегат select-option-delegate (например, combobox) для отображения в качестве параметров данных, сохраненных в столбце моего QTableModel, который я выбираю. Я не могу этого сделать, поскольку (я думаю), переопределяя аргументы функций, не содержит всю модель, а только элемент QTableModel.

Я не знаю, как заполнить редактор делегата данными столбца модели. Я думаю, что это невозможно сделать из-за проблем с безопасностью при программировании, я попытался отправить сигнал от делегата с просьбой о модели, но, похоже, делегаты не могут излучать сигналы.

Может ли кто-нибудь направить меня на то, как это сделать?

Я посмотрел делегата combobox с примером пользовательских опций, который находится вокруг, но тот не читает параметры из модели, параметры загружаются как константы.

Теги:
delegates
view
qt
model

2 ответа

0
Лучший ответ

1.Если вы создали новый класс, полученный из QStyledItemDelegate или QAbstractItemDelegate вы можете создать новый constructor и передать туда указатель на модель или что угодно.

2. Также вы можете использовать методы QModelIndex для получения любых данных из модели. Например: index.data() будет возвращать данные для отображения, index.data(Qt::UserRole) будет возвращать все, что вы реализовали его в data методе модели. Пример:

 virtual QVariant MyMode::data (const QModelIndex & index, int role) const
 {
    if (role == Qt::UserRole)
      return m_options;
    ...
 }

 QWidget *StyledItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
 {
     Options options = index.data(Qt::UserRole).value<Options>()
     ...
 }
  • 0
    1. Поэтому после создания класса MyCustomDelegate на конструкторе моего основного виджета должен появиться: model = new QSqlTablemodel; view = new QTableModel; MyCustomDelegate * mydelegate = new MyCustomDelegate (модель); view-> setdelegateforcolumn (mydelegate, колонка); , , 2. Вы говорите, что я могу создать UserRole, чтобы данные могли возвращать мне экземпляр данных элемента, данных всего столбца, в котором установлен элемент? Спасибо за ваш ответ!
  • 0
    @ user2348235 1 - да. 2 - да. То, что возвращает UserRole зависит от вас. В моем примере он возвращает некоторые параметры независимо от того, что столбец. Вы можете добавить проверку, if (role == Qt::UserRole and index.column() == 0 или switch(index.column()) case 0: return settingsA; case 1: return settingsB;...
0

К сожалению, после большого количества кодировок и плохого времени работы классов. Я обнаружил, что есть виджет, который уже выполняет автозаполнение во время поиска совпадений на выбранной вами модели. Класс называется QCompleter...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню