Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: deis от Ноябрь 24, 2010, 22:48



Название: Вопрос про меню
Отправлено: deis от Ноябрь 24, 2010, 22:48
А именно можно ли без особых заморочек сделать так, чтобы выбор пункта меню отрабатывался стандартным образом (генерировался соответствующий сигнал), но само меню при этом не закрывалось?


Название: Re: Вопрос про меню
Отправлено: GreatSnake от Ноябрь 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 меню убираться не будет.


Название: Re: Вопрос про меню
Отправлено: deis от Ноябрь 25, 2010, 11:39
Мерси, повоюю!


Название: Re: Вопрос про меню
Отправлено: deis от Ноябрь 25, 2010, 22:46
Я придумал простое решение - это использование QWidgetAction вместо QAction...


Название: Re: Вопрос про меню
Отправлено: Lion от Декабрь 14, 2010, 21:56
Работает нормально, но если это меню является дочерним, то при клике оно не пропадает, зато пропадают все родительские меню.


Название: Re: Вопрос про меню
Отправлено: Lion от Декабрь 14, 2010, 22:02
Можно вот так изменить
Код:
void QUCheckableMenu::mouseReleaseEvent( QMouseEvent* e )
{
QAction *action = actionAt(e->pos());
if (action)
action->trigger();
else
QMenu::mouseReleaseEvent( e );
}

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

P.S.
Мне нужно было, чтобы меню не исчезало никогда, если не вызывало новых окон.


Название: Re: Вопрос про меню
Отправлено: Te0reTiK от Апрель 10, 2011, 15:02
GreatSnake, ваше решение исправно работает!
А как сделать так, чтобы меню пропадало только при клике мышкой вне меню (Т.е. при потере фокуса)? ???

Примечание: переопределение focusOutEvent не работает.


Название: Re: Вопрос про меню
Отправлено: Te0reTiK от Апрель 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)