crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Перехват событий QWidget, Определение событий мыши и клавиатуры без переопределения методов
maksimus1210
  опции профиля:
сообщение 3.3.2013, 9:29
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.3.2013
Пользователь №: 3733

Спасибо сказали: 0 раз(а)




Репутация:   0  


Приветствую всех! Интересует один вопрос, поясню на примере: на форме есть кнопка QPushButton, мне нужно регистрировать события нажатия этой кнопки и отжатия, причём нужно получить указатель на QMouseEvent передаваемый в класс QPushButton. Это нужно для ведения логфайла. Жду помощи! :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maksimus1210
  опции профиля:
сообщение 3.3.2013, 10:01
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.3.2013
Пользователь №: 3733

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пока смог сделать только с переопределением методов, выглядит это так:

// Заголовочный файл Button.h

#include <QtGui>
#include <QPushButton>

class Button : public QPushButton
{
    Q_OBJECT
public:
    explicit Button(QWidget *parent = 0)
    {

    }

private:
    void mousePressEvent(QMouseEvent *e)
    {
        qDebug() << objectName() << ";" << e->pos();
        QAbstractButton::mousePressEvent(e);
    }

};

// Заголовочный файл Widget.h
#include <QWidget>
#include "button.h"

class Widget : public QWidget
{
    Q_OBJECT

    Button *pButton, *pButton2;

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void mousePress(bool state);
    void mousePress2(bool state);
};

// Файл Widget.cpp
#include "widget.h"

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    setObjectName("Widget");

    pButton = new Button;
    pButton->setObjectName("Button");
    pButton->setCheckable(true);
    pButton->setText("Button");
    connect(pButton, SIGNAL(toggled(bool)), this, SLOT(mousePress(bool)));
    pButton->show();

    pButton2 = new Button;
    pButton2->setObjectName("Button2");
    pButton2->setCheckable(true);
    pButton2->setText("Button2");
    connect(pButton2, SIGNAL(toggled(bool)), this, SLOT(mousePress2(bool)));
    pButton2->show();

}

Widget::~Widget()
{

}

void Widget::mousePress(bool state)
{
    qDebug() << objectName() << ";mousePress()" << state;
}

void Widget::mousePress2(bool state)
{
    qDebug() << objectName() << ";mousePress2()" << state;
}


Задачу мою такой способ решает, но не хочется создавать класс наследник.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 3.3.2013, 10:43
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Можно сделать через EventFilter.
Event Filters
QObject::eventFilter
QObject::installEventFilter

Сообщение отредактировал ilyabvt - 3.3.2013, 10:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maksimus1210
  опции профиля:
сообщение 3.3.2013, 12:39
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 3.3.2013
Пользователь №: 3733

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да, спасибо, я как раз наткнулся на Статья по использованию QEventFilter статью по этому поводу. Конечно хотелось обойтись без классов потомков, но видимо, что без них никак.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.3.2013, 14:33
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


При использовании EventFilter потомки не нужны.

Нужно просто this->installEventFilter(button);
а затем в этом же классе обрабатывать события кнопки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.3.2013, 22:33
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, только там наоборот

monitoredObj->installEventFilter(filterObj);

аргумент - это фильтратор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 10:28