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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: eventFilter()  (Прочитано 16762 раз)
kip_one
Гость
« : Декабрь 23, 2012, 21:57 »

Постала такая небольшая проблема. Нужно что бы когда наводишь курсор на QLabel (он в фокусе), то QLabel скрывается , а QPushButton становится видимым.
 вот мои наброски:
code.h
Код:
...
struct strct{QLabel * a;
QPushButton * b;};
strct * one;
bool eventFilter(QObject *object, QEvent *event);
...

code.cpp
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
one = new strct;
one->a = new QLabel;
one->b = new QPushButton;
one->b->setVisible(false);
    installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *object, QEvent *event){
if(object == one->a)
    if (event->type() == QEvent::FocusIn){
     one->a->setVisible(false);
     one->b->setVisible(true);}

    return false;
}

Вообщем не работает.Прошу помощи.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #1 : Декабрь 23, 2012, 22:09 »

вместо installEventFilter(this); напиши one->a->installEventFilter(this);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kip_one
Гость
« Ответ #2 : Декабрь 23, 2012, 22:36 »

Уже пробовал такую схему, нет
Записан
kip_one
Гость
« Ответ #3 : Декабрь 23, 2012, 23:04 »

Событие возникает только один раз, когда форма становится активной
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #4 : Декабрь 23, 2012, 23:07 »

событие hover, а не focus
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
VPS
Гость
« Ответ #5 : Декабрь 24, 2012, 00:22 »

Попробуйте вместо QEvent::FocusIn использовать два события: QEvent::Enter (когда указатель входит в область метки) и QEvent::Leave (указатель покидает область метки).
Должно работать...
Записан
kip_one
Гость
« Ответ #6 : Декабрь 24, 2012, 00:39 »

QEvent::Enter/Leave работает, спасибо
Записан
kip_one
Гость
« Ответ #7 : Декабрь 24, 2012, 01:02 »

Еще вопрос, если у меня массив таких структур можно ли узнать какой именно элемент вызвал событие

Код:
bool MainWindow::eventFilter(QObject *object, QEvent *event){
 
    if(object == usersList[i].bb)
    if (event->type() == QEvent::Enter){
        usersList[i].cc->setVisible(true);
        usersList[i].bb->setVisible(false);}
    if(object == usersList[i].cc)
    if(event->type() == QEvent::Leave){
        usersList[i].cc->setVisible(false);
        usersList[i].bb->setVisible(true);}


    return false;
}


Что бы вместо i был номер из массива
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #8 : Декабрь 24, 2012, 02:19 »

сходу нельзя, только если свою функцию напишешь
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Firefox
Гость
« Ответ #9 : Декабрь 24, 2012, 11:51 »

mouseMoveEvent()
и в нем написать
if Label->hasMouse()
{
}
тогда можно без эвент фильтра.
Записан
kip_one
Гость
« Ответ #10 : Декабрь 24, 2012, 22:07 »

Можно по-подробней про написание функции.
Может я хреново объяснил.
usersList[10] - массив структур (Qlabel-bb,QPushButton-cc)
Нужно что-бы eventFilter работал как-то именно с структурой которая вызвала событие.
Код:
bool MainWindow::eventFilter(QObject *object, QEvent *event){
 
    if(object == usersList[i].bb)
    if (event->type() == QEvent::Enter){
        usersList[i].cc->setVisible(true);
        usersList[i].bb->setVisible(false);}
    if(object == usersList[i].cc)
    if(event->type() == QEvent::Leave){
        usersList[i].cc->setVisible(false);
        usersList[i].bb->setVisible(true);}


    return false;
}
« Последнее редактирование: Декабрь 24, 2012, 22:15 от kip_one » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #11 : Декабрь 24, 2012, 23:20 »

перебираешь массив и сравниваешь object с каждым из полей структуры, при успехе возвращаешь текущий индекс (или можно сразу ссылку на саму структуру, чтобы лишний раз не обращаться к массиву)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kip_one
Гость
« Ответ #12 : Декабрь 24, 2012, 23:23 »

Циклом я уже пробовал. Без него никак?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #13 : Декабрь 24, 2012, 23:38 »

ну а как по-другому? даже если бы и был подобный метод у массива, он бы внутри тоже проходил по самому себе.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kip_one
Гость
« Ответ #14 : Декабрь 24, 2012, 23:41 »

Проблема в том что если событие возникает сильно часто, то загрузка ЦП более чем 10% из-за цикла который может быть от 0 до 3 так и от 0 до 75
« Последнее редактирование: Декабрь 24, 2012, 23:52 от kip_one » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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