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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить фокус мыши на QToolButton и выход фокуса из QMenu?  (Прочитано 8621 раз)
faithman
Гость
« : Февраль 15, 2009, 16:10 »

ПО: Qt 4.4.3 под Win Vista 64bit

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

Кто знает где эти сигналы взять ,или как реализовать их через QEvent ?
Если есть пример конкретный или кусок кода буду рад и этому.
Записан
ритт
Гость
« Ответ #1 : Февраль 15, 2009, 17:25 »

"фокус мыши" - это что? Hover?
Записан
faithman
Гость
« Ответ #2 : Февраль 15, 2009, 18:30 »

Уточнение: вот мы указателем мыши встали на кнопку,она тут же выделилась (без клика) - этот сигнал нужен,искал от AbstractButton и Widget
таких сигналов или слотов нет,только фокус от клавиатуры.

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

Вот эти вещи может быть пригодились .Наверно нужно унаследовать QToolButton и добавить сигнал от таких событий ,если это то что нужно мне ?
Записан
ритт
Гость
« Ответ #3 : Февраль 15, 2009, 19:24 »

installEventFilter - и наследоваться не нужно. сигналы тоже не нужны.
вообще не пойму суть задачи - раскрыть меню, ассоциированное с кнопкой, showMenu(). скрытие меню и так происходит при потере кнопкой фокуса.
Записан
faithman
Гость
« Ответ #4 : Февраль 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);
}
 
« Последнее редактирование: Февраль 15, 2009, 21:48 от pastor » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Февраль 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);
}
« Последнее редактирование: Февраль 17, 2009, 13:21 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #6 : Февраль 17, 2009, 13:09 »

/* а Константин тем временем сомневается, что это будет работать...но проверять ленится */
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Февраль 17, 2009, 13:22 »

Че ж так? Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #8 : Февраль 17, 2009, 16:52 »

/* а тему кто-то перенёс или она в новичках и была? */

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

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

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Февраль 17, 2009, 17:35 »

/* тема здесь и была */

Мне кажется с event filter должно работать, покрайней мере в теории так Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
crackedmind
Гость
« Ответ #10 : Февраль 19, 2009, 19:12 »

А перегрузка функций leaveEvent & enterEvent для виджетов не подойдет?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Февраль 19, 2009, 19:20 »

А перегрузка функций leaveEvent & enterEvent для виджетов не подойдет?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
crackedmind
Гость
« Ответ #12 : Февраль 20, 2009, 09:24 »

По мне так лучше наследоваться, чем к каждой кнопке фильтр приделывать.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Февраль 20, 2009, 12:51 »

Зачем к каждой? Фильтр будет один для всех
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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