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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос про меню  (Прочитано 5688 раз)
deis
Гость
« : Ноябрь 24, 2010, 22:48 »

А именно можно ли без особых заморочек сделать так, чтобы выбор пункта меню отрабатывался стандартным образом (генерировался соответствующий сигнал), но само меню при этом не закрывалось?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 25, 2010, 11:08 »

Можно, но без заморочек навряд ли.
Вот - дарю  Улыбающийся
Код
C++ (Qt)
#include <QMenu>
#include <QMouseEvent>
#include <QKeyEvent>
 
class QUCheckableMenu : public QMenu
{
Q_OBJECT
public:
QUCheckableMenu( QWidget* parent = 0 );
virtual ~QUCheckableMenu() {}
protected:
void mouseReleaseEvent( QMouseEvent* e );
void keyPressEvent( QKeyEvent* e );
void setVisible( bool set );
 
private:
bool skip_hide_;
};
 
QUCheckableMenu::QUCheckableMenu( QWidget* parent )
: QMenu( parent )
, skip_hide_( false )
{
setCheckable( true );
}
 
void QUCheckableMenu::mouseReleaseEvent( QMouseEvent* e )
{
if( rect().contains( e->pos() ) && ( e->state() & Qt::ControlButton ) )
skip_hide_ = true;
QMenu::mouseReleaseEvent( e );
}
 
void QUCheckableMenu::keyPressEvent( QKeyEvent* e )
{
QMenu::keyPressEvent( e );
if( ( e->key() == Qt::Key_Space ||
e->key() == Qt::Key_Return ||
e->key() == Qt::Key_Enter ) &&
( e->state() & Qt::ControlButton ) )
skip_hide_ = true;
}
 
void QUCheckableMenu::setVisible( bool set )
{
if( set )
{
QMenu::setVisible( set );
} else
{
if( !skip_hide_ )
QMenu::setVisible( set );
skip_hide_ = false;
}
}
 
При нажатом Ctrl и кнопки мыши или Space|Enter меню убираться не будет.
« Последнее редактирование: Ноябрь 25, 2010, 11:13 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
deis
Гость
« Ответ #2 : Ноябрь 25, 2010, 11:39 »

Мерси, повоюю!
Записан
deis
Гость
« Ответ #3 : Ноябрь 25, 2010, 22:46 »

Я придумал простое решение - это использование QWidgetAction вместо QAction...
Записан
Lion
Гость
« Ответ #4 : Декабрь 14, 2010, 21:56 »

Работает нормально, но если это меню является дочерним, то при клике оно не пропадает, зато пропадают все родительские меню.
Записан
Lion
Гость
« Ответ #5 : Декабрь 14, 2010, 22:02 »

Можно вот так изменить
Код:
void QUCheckableMenu::mouseReleaseEvent( QMouseEvent* e )
{
QAction *action = actionAt(e->pos());
if (action)
action->trigger();
else
QMenu::mouseReleaseEvent( e );
}

всё остальное можно убрать

P.S.
Мне нужно было, чтобы меню не исчезало никогда, если не вызывало новых окон.
« Последнее редактирование: Декабрь 14, 2010, 22:05 от Lion » Записан
Te0reTiK
Гость
« Ответ #6 : Апрель 10, 2011, 15:02 »

GreatSnake, ваше решение исправно работает!
А как сделать так, чтобы меню пропадало только при клике мышкой вне меню (Т.е. при потере фокуса)? Непонимающий

Примечание: переопределение focusOutEvent не работает.
« Последнее редактирование: Апрель 10, 2011, 17:05 от Te0reTiK » Записан
Te0reTiK
Гость
« Ответ #7 : Апрель 11, 2011, 03:22 »

проблема решена
Код
Python
class ChechableMenu(QtGui.QMenu):
   def __init__(self):
       QtGui.QMenu.__init__(self)
       self.installEventFilter(self)
       self.visible_flag = True
 
   def setVisible(self, mode):
       #print 'SetVisible( ' + str(mode) + ' )' + ' flag = ' + str(self.visible_flag)
       QtGui.QMenu.setVisible(self, mode | self.visible_flag)
 
   def eventFilter(self, object, event):
       event_type = event.type()
       if event_type in (2, 3, 4):
           print 'Mouse ' + str(event_type)
           self.visible_flag = True
           return QtGui.QWidget.eventFilter(self, object, event)
       elif event_type == 19:
           print 'Close'
           self.visible_flag = False
           return True
       else:
           return QtGui.QWidget.eventFilter(self, object, event)
« Последнее редактирование: Апрель 11, 2011, 03:25 от Te0reTiK » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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