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