Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Blitz156 от Февраль 15, 2013, 16:29



Название: ComboBox, раскрытие по DblClick. [Решено]
Отправлено: Blitz156 от Февраль 15, 2013, 16:29
Есть делегат, в нем 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(), возможно кто-то знает как насильно выделить строку.
(http://)


Название: Re: ComboBox, раскрытие по DblClick.
Отправлено: Blitz156 от Февраль 15, 2013, 19:08
Подход был тупиковым. Решил проблему искусственным созданием QMouseEvent.

Код:
bool ComboBoxDelegate::eventFilter(QObject *object, QEvent *event)
{
    if (object == editor_ && event->type() == QEvent::FocusIn)
    {
        QMouseEvent *me = static_cast<QMouseEvent*>(event);

        QMouseEvent me2(QEvent::MouseButtonPress, me->pos(), Qt::LeftButton , Qt::LeftButton, Qt::NoModifier);
        QApplication::sendEvent(object, &me2);
    }
}

Код:
QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
.......
this->editor_ = editor;
}

ну и openPersistentEditor() не нужен.