Ну, этот вопрос может быть сделан из-за моего плохого понимания работы делегатов.
Использование структуры модели/представления. До сих пор я сделал несколько делегированных делегатов, но сейчас мне нужно получить делегат select-option-delegate (например, combobox) для отображения в качестве параметров данных, сохраненных в столбце моего QTableModel, который я выбираю. Я не могу этого сделать, поскольку (я думаю), переопределяя аргументы функций, не содержит всю модель, а только элемент QTableModel.
Я не знаю, как заполнить редактор делегата данными столбца модели. Я думаю, что это невозможно сделать из-за проблем с безопасностью при программировании, я попытался отправить сигнал от делегата с просьбой о модели, но, похоже, делегаты не могут излучать сигналы.
Может ли кто-нибудь направить меня на то, как это сделать?
Я посмотрел делегата combobox с примером пользовательских опций, который находится вокруг, но тот не читает параметры из модели, параметры загружаются как константы.
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>()
...
}
К сожалению, после большого количества кодировок и плохого времени работы классов. Я обнаружил, что есть виджет, который уже выполняет автозаполнение во время поиска совпадений на выбранной вами модели. Класс называется QCompleter...
UserRole
зависит от вас. В моем примере он возвращает некоторые параметры независимо от того, что столбец. Вы можете добавить проверку,if (role == Qt::UserRole and index.column() == 0
илиswitch(index.column()) case 0: return settingsA; case 1: return settingsB;...