Невозможно получить объект отправителя в слоте сигнала dataChanged QAbstractItemModel

Я подкласс QAbstractItemModel и пытаюсь получить виджет в слоте сигнала dataChanged.

connect(model, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(slotDataChanged(const QModelIndex&, const QModelIndex&)));

void MyEditor::slotDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
QComboBox* widget = dynamic_cast<QComboBox*>(sender());
if (widget)
{
// do something
}
}

Здесь я получаю нулевой виджет каждый раз, тот же результат с qobject_cast.

Я устанавливаю виджет со списком в моем табличном представлении класс делегата, который наследует QStyledItemDelegate.

MyDelegate* myDelegate;
myDelegate = new MyDelegate();
tableView->setItemDelegate(myDelegate);
tableView->setModel(model);QWidget* MyDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QComboBox* cb = new QComboBox(parent);
cb->addItem(QString("All"));
cb->setCurrentIndex(0);
return cb;
}

Как я могу получить объект отправителя в этом случае? Благодарю.

0

Решение

Не уверен, каковы ваши намерения. Получение виджета редактора, когда данные уже обновлены в модели, вообще не требуется.
Сдается мне, что краткое введение в Model-View-Delegate Концепция нужна для решения вашей проблемы.

Короче говоря, мнение, которое в вашем случае является QTableView, не имеет данных сам по себе. Просмотр получает данные из подключенной модели, позвонив data метод. Когда пользователь пытается редактировать некоторые данные, делегировать createEditor а также setEditorData методы называются. Последний имеет указатель модели в качестве одного из аргументов, поэтому он может получить доступ к фактическим данным, которые должны быть представлены.

Когда пользователь заканчивает редактирование setModelData вызывается, который имеет виджет редактора, доступный для получения обновленного значения. У него также есть модель для изменения правильного ввода данных, обычно выполняемого через setData метод. В этот момент испускается сигнал dataChanged, который уведомляет представление о том, что соответствующие данные были обновлены, чтобы он мог обновить отображаемые значения.

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

Вы также можете проверить сайт Qt для Пример звездного делегата чтобы увидеть некоторые примеры реализации или Модель просмотра учебника для более широкого описания темы Model-View.

1

Другие решения

Дизайн моей модели / вида был в порядке. Мне просто нужно было получить виджет, когда пользователь дважды щелкает ячейку в моем редакторе.

QComboBox* widget = dynamic_cast<QComboBox*>(tableView->indexWidget(topLeft));
if (widget)
{
// Do something
}

Здесь в slotDataChanged я получил требуемый виджет, используя QModelIndex.
Спасибо за помощь мне.

0

По вопросам рекламы [email protected]