Есть делегат, в нем ComboBox, задача раскрывать с двойного клика, а также по нажатию Enter.
По дефолту - DblClick - преход в режим редактирования(появляется button с полями и стрелочками) и далее по клику на него раскрытие ComboBox.
Частичное решение: QTableView::openPersistantEditor(), тем самым сразу открыв редактор. Перерисовал button со стрелками в обычный label, и далее, происходит раскрытие по одиночному клику. Нужен двойной. В QStyledItemDelegate::eventFilter() возвращаю true по одиночному клику или фокусу. Комбо не раскрывается, но происходит выделение не тем цветом. Решается через closeEditor() , но тогда делегат перестает реагировать на нажатие клавиш.
Код eventFilter + paint() для делегата
bool ComboBoxDelegate::eventFilter(QObject *object, QEvent *event)
{
ComboBox *editor = qobject_cast<ComboBox*>(object); // чит для выделения строки
if (!editor)
return false;
if (event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::MouseButtonRelease ||
event->type() == QEvent::FocusIn)
{
emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache);
return true;
}
return false;
}
void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QVariant value = index.data(Qt::EditRole);
if (value.isValid())
{
QStyleOptionViewItemV4 modifiedOpt(option);
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &modifiedOpt, painter);
}
else {
QStyledItemDelegate::paint(painter, option, index);
}
}
Унаследованный комбобокс
void ComboBox::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
QStylePainter painter(this);
QStyleOptionComboBox option;
QComboBox::initStyleOption(&option);
painter.drawControl(QStyle::CE_ComboBoxLabel, option);
}
Какие есть варианты доделывания этого варианта, либо другого, например без открытия редактора и как-то без перехода в режим редактирования сразу раскрывать comboBox.
P.S. Нет реакции на нажатие клавиш, потому что делегат теряет фокус.
На картинке проблема выделения, если не делать closeEditor(), возможно кто-то знает как насильно выделить строку.