Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sergs от Апрель 05, 2017, 19:18



Название: [РЕШЕНО] QComboBox: не закрывать выпадающий список после клика
Отправлено: sergs от Апрель 05, 2017, 19:18
Реализовал класс-наследник QComboBox, который позволяет выбирать несколько элементов. Для этого создал свою модель и выполняю отрисовку элементов при помощи QStyledItemDelegate (т.к. иначе в некоторых окружениях флажки не отображаются). Осталась одна проблема: выпадающий список закрывается сразу же после щелчка на каком-то элементе. Мне же нужно, чтобы список закрывался только тогда, когда курсор покинет область выдпадающего списка или пользователь щелкнет за его пределами.

Пробовал переопределить hidePopup()
Код:
void MyCombo::hidePopup()
{
  if (!view()->underMouse())
  {
    QComboBox::hidePopup();
  }
}

Но в Qt 5.5 такой вариант не работает. Попытался сделать через eventFilter() (обработка правой клавиши мыши нужна для других целей)
Код:
bool MyCombo::eventFilter(QObject *object, QEvent *event)
{
  if (event->type() == QEvent::MouseButtonRelease)
  {
    if (static_cast<QMouseEvent *>(event)->button() == Qt::RightButton)
    {
      return true;
    }
    if (object == view())
    {
      return true;
    }    
  }
  return false;
}

но так игнорируются все клики и нельзя снять/установить флажок.
Может, подскажете как реализовать нужное поведение?


Название: Re: QComboBox: не закрывать выпадающий список после клика
Отправлено: GraninDm от Апрель 06, 2017, 10:12
Вообще в гугле дофига всякого разного по этому поводу
первая ссылка
http://stackoverflow.com/questions/17786036/how-to-show-rich-text-in-the-qcombobox-lineedit-or-how-to-replace-the-lineedi (http://stackoverflow.com/questions/17786036/how-to-show-rich-text-in-the-qcombobox-lineedit-or-how-to-replace-the-lineedi)
Правда там код на python, но вдруг поможет.


Название: Re: QComboBox: не закрывать выпадающий список после клика
Отправлено: sergs от Апрель 06, 2017, 15:01
Вообще в гугле дофига всякого разного по этому поводу
первая ссылка
http://stackoverflow.com/questions/17786036/how-to-show-rich-text-in-the-qcombobox-lineedit-or-how-to-replace-the-lineedi (http://stackoverflow.com/questions/17786036/how-to-show-rich-text-in-the-qcombobox-lineedit-or-how-to-replace-the-lineedi)
Правда там код на python, но вдруг поможет.

Видимо, не так искал, т.к. ваша ссылка мне не попадалась.

Попробовал взять оттуда фрагмент фильтра
Код:
bool MyCombo::eventFilter(QObject *object, QEvent *event)
{
  if (event->type() == QEvent::MouseButtonRelease)
  {
    if (static_cast<QMouseEvent *>(event)->button() == Qt::RightButton)
    {
      return true;
    }
    if (object != view() && object != view()->window())
    {
      QComboBox::hidePopup();
    }   
  }
  return false;
}

увы, не работает. Выпадающий список все равно закрывается после первого клика.


Название: Re: QComboBox: не закрывать выпадающий список после клика
Отправлено: ssoft от Апрель 06, 2017, 18:07
Так должно работать

Код
C++ (Qt)
MyComboBox::MyComboBox( QWidget * parent )
: QComboBox( parent )
, m_skip_next_hide( false )
{
...
view()->viewport()->installEventFilter( this );
...
};
 
bool MyComboBox::eventFilter ( QObject * object, QEvent * event )
{
if ( ( event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease )
&& object == view()->viewport() )
{
...
m_skip_next_hide = true;
}
return QComboBox::eventFilter( object, event );
}
 
void MyComboBox::hidePopup ()
{
if ( !m_skip_next_hide )
QComboBox::hidePopup();
m_skip_next_hide = false;
};
 
 


Название: Re: QComboBox: не закрывать выпадающий список после клика
Отправлено: sergs от Апрель 07, 2017, 10:07
Так должно работать

Огромное спасибо, все работает!