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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QComboBox: не закрывать выпадающий список после клика  (Прочитано 5706 раз)
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;
}

но так игнорируются все клики и нельзя снять/установить флажок.
Может, подскажете как реализовать нужное поведение?
« Последнее редактирование: Апрель 07, 2017, 10:07 от sergs » Записан
GraninDm
Гость
« Ответ #1 : Апрель 06, 2017, 10:12 »

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

Вообще в гугле дофига всякого разного по этому поводу
первая ссылка
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;
}

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

Сообщений: 574


Просмотр профиля
« Ответ #3 : Апрель 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;
};
 
 
« Последнее редактирование: Апрель 06, 2017, 18:20 от ssoft » Записан
sergs
Гость
« Ответ #4 : Апрель 07, 2017, 10:07 »

Так должно работать

Огромное спасибо, все работает!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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