Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: faithman от Февраля 15, 2009, 16:10



Название: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: faithman от Февраля 15, 2009, 16:10
ПО: Qt 4.4.3 под Win Vista 64bit

Создаю тулбар с 4-мя QToolButton (на них только иконки) с подключенными QMenu к ним.
Мне нужно отловить сигналы фокуса мыши на кнопке,без клика на неё,и если он есть раскрыть QMenu этой кнопки,а дальше если кликнуть в не QMenu
этой кнопки выловить этот фокус и закрыть это QMenu и выставить QToolButton по дефолту (не нажатая).

Кто знает где эти сигналы взять ,или как реализовать их через QEvent ?
Если есть пример конкретный или кусок кода буду рад и этому.


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: ритт от Февраля 15, 2009, 17:25
"фокус мыши" - это что? Hover?


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: faithman от Февраля 15, 2009, 18:30
Уточнение: вот мы указателем мыши встали на кнопку,она тут же выделилась (без клика) - этот сигнал нужен,искал от AbstractButton и Widget
таких сигналов или слотов нет,только фокус от клавиатуры.

QEvent::HoverEnter   127   Указатель мыши входит в область перемещения виджета (QHoverEvent).
QEvent::HoverLeave   128   Указатель мыши покидает область перемещения виджета (QHoverEvent).

Вот эти вещи может быть пригодились .Наверно нужно унаследовать QToolButton и добавить сигнал от таких событий ,если это то что нужно мне ?


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: ритт от Февраля 15, 2009, 19:24
installEventFilter - и наследоваться не нужно. сигналы тоже не нужны.
вообще не пойму суть задачи - раскрыть меню, ассоциированное с кнопкой, showMenu(). скрытие меню и так происходит при потере кнопкой фокуса.


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: faithman от Февраля 15, 2009, 19:58
installEventFilter - и наследоваться не нужно. сигналы тоже не нужны.
вообще не пойму суть задачи - раскрыть меню, ассоциированное с кнопкой, showMenu(). скрытие меню и так происходит при потере кнопкой фокуса.


Вот мой тулбар,для смены меню при переходе с одной на другую кнопку нужно 2-а клика мыши.Первый "происходит при потере кнопкой фокуса",а второй при нажатии на соседнюю кнопку,чтобы увидеть ей меню.Мне нужно показывать меню кнопок быстрым листанием как это есть у QMenuBar.

.h

Код
C++ (Qt)
#ifndef MENUBAR_H
#define MENUBAR_H
//version 0.1.2
#include <QtGui>
#include <QToolBar>
#include <QWidget>
#include <QString>
#include <QAction>
#include <QMenu>
#include <QToolButton>
 
class menubar: public QToolBar
{
Q_OBJECT
public:
menubar(QWidget * parent=0);
QMenu * menuOptions;
QMenu * menuViews;
QMenu * menuFavorits;
QMenu * menuHelp;
QToolButton * options;
QToolButton * views;
QToolButton * favorits;
QToolButton * help;
private slots:
};
#endif
 

.cpp

Код
C++ (Qt)
#include "menubar.h"
//
menubar::menubar(QWidget * parent)
{
setWindowTitle(QString::fromUtf8("Меню"));
//Кнопка "Опции"
options=new QToolButton(this);
// options->setIcon(QIcon(":/4vert/4vert.png"));
options->setPopupMode(QToolButton::InstantPopup);
QObject::connect(options,SIGNAL(clicked()),views,SLOT(pressed()));
menuOptions=new QMenu;
menuOptions->addAction(QString::fromUtf8("В разработке"));
options->setMenu(menuOptions);
 
//Кнопка "Вид"
views=new QToolButton(this);
// views->setIcon(QIcon(":/4vert/4vert.png"));
views->setPopupMode(QToolButton::InstantPopup);
QObject::connect(views,SIGNAL(clicked()),views,SLOT(pressed()));
menuViews=new QMenu;
menuViews->addAction(QString::fromUtf8("В разработке"));
views->setMenu(menuViews);
 
//Кнопка "Избранное"
favorits=new QToolButton(this);
// favorits->setIcon(QIcon(":/4vert/4vert.png"));
favorits->setPopupMode(QToolButton::InstantPopup);
QObject::connect(favorits,SIGNAL(clicked()),favorits,SLOT(pressed()));
menuFavorits=new QMenu;
menuFavorits->addAction(QString::fromUtf8("В разработке"));
favorits->setMenu(menuFavorits);
 
//Кнопка "Справка"
help=new QToolButton(this);
// help->setIcon(QIcon(":/4vert/4vert.png"));
help->setPopupMode(QToolButton::InstantPopup);
QObject::connect(help,SIGNAL(clicked()),help,SLOT(pressed()));
menuHelp=new QMenu;
menuHelp->addAction(QString::fromUtf8("В разработке"));
help->setMenu(menuHelp);
 
menubar::addWidget(options);
menubar::addWidget(views);
menubar::addWidget(favorits);
menubar::addWidget(help);
}
 


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: pastor от Февраля 17, 2009, 12:59
Как уже сказал Константин, установи фильтр событий (installEventFilter) для QToolButton'ов


Код
C++ (Qt)
options=new QToolButton(this);
options->installEventFilter(this);
 
...
 
favorits=new QToolButton(this);
favorits->installEventFilter(this);
...

Далее объяви

Код
C++ (Qt)
virtual bool eventFilter ( QObject * watched, QEvent * event );

и определи метод:

Код
C++ (Qt)
bool menubar::eventFilter ( QObject * watched, QEvent * event )
{
   if (watched->inherits("QToolButton")) {
        if (event->type() == QEvent::HoverEnter) {
             //кнопка получила "фокус" мыши
             return true;
        }
 
        if (event->type() == QEvent::HoverLeave) {
            //кнопка потеряла "фокус" мыши
            return true;
        }
 
        return false;
   }
 
    return QToolBar::eventFilter(watched, event);
}


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: ритт от Февраля 17, 2009, 13:09
/* а Константин тем временем сомневается, что это будет работать...но проверять ленится */


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: pastor от Февраля 17, 2009, 13:22
Че ж так? :)


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: ритт от Февраля 17, 2009, 16:52
/* а тему кто-то перенёс или она в новичках и была? */

повторюсь - я специально не проверял...но тревожат меня смутные воспоминания будто бы я когда-то где-то удивлялся странностям ивентов при выпавшем меню...вот как-то так вот всё неясно :)
вероятно, чуть попозжа я всё-таки пересилю этот приступ лени после ??нутого рабочего дня и набросаю тестовое приложение...но не факт :)

а пять минут назад заметил, что в снапшоте 4.5 длина клика для контекстных меню сократилась - теперь меню закрывается и открывается в новой позиции с первого клика. причём, этот же клик активирует виджет под курсором, что решает вопрос о контекстном меню в таблвью, поднятый мной с пол-года назад и оставшийся тогда без решения :) и в дополнение к этому приятному открытию обнаружил также, что менюшки теперь выглядят симпатишнее (нет лишних отступов от иконок и т.п.), а комбобоксы теперь лучше мимикрируют под нативные - так же анимируют попап при активации, например... да и вообще виджеты стали заметно быстрее реагировать на события...или это сказывается тот факт, что собирался снапшот под гцц4.3.2? :)


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: pastor от Февраля 17, 2009, 17:35
/* тема здесь и была */

Мне кажется с event filter должно работать, покрайней мере в теории так :)


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: crackedmind от Февраля 19, 2009, 19:12
А перегрузка функций leaveEvent & enterEvent для виджетов не подойдет?


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: pastor от Февраля 19, 2009, 19:20
А перегрузка функций leaveEvent & enterEvent для виджетов не подойдет?

Чтобы перегрузить - нужно наследоваться. EventFilter исбпвляет от наследования


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: crackedmind от Февраля 20, 2009, 09:24
По мне так лучше наследоваться, чем к каждой кнопке фильтр приделывать.


Название: Re: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?
Отправлено: pastor от Февраля 20, 2009, 12:51
Зачем к каждой? Фильтр будет один для всех