Russian Qt Forum
Ноябрь 23, 2024, 10:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ComboBox, раскрытие по DblClick. [Решено]  (Прочитано 3181 раз)
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(), возможно кто-то знает как насильно выделить строку.

« Последнее редактирование: Февраль 15, 2013, 19:09 от Blitz156 » Записан
Blitz156
Гость
« Ответ #1 : Февраль 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() не нужен.
« Последнее редактирование: Февраль 15, 2013, 19:14 от Blitz156 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.33 секунд. Запросов: 21.