Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bez_glaz от Апреля 10, 2012, 10:35



Название: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 10:35
Добрый день.
В общем нужно отловить нажатие мыши в любом месте и на любой виждет на форме. Как сделать ? Через слот - сигналы ? Флаги или эвент ?
Т.е. грубо говоря по нажатию мыши я должен иметь хоть какую-то информацию об этом нажатии - позиция (координаты) относительно главной формы или же информация о том на какой виджет я кликнул.
Пробовал бурить EventFilter.
mainwindow.h
Код:
...
protected:

    bool eventFilter(QObject * obj, QEvent *event);
...
mainwindow.cpp в конструкторе
Код:
ui->centralWidget->installEventFilter(this);
mainwindow.cpp описание функции
Код:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if ((event->type() == QEvent::MouseButtonPress))
    {
        QMessageBox mes;
        mes.setText(obj->objectName());
        mes.exec();
    }
}
Месседж выводится только на клик в свободное пространство формы.
Если в конструкторе прописываю напрмер mainwindow.cpp в конструкторе
Код:
ui->QTableView_obj->installEventFilter(this);
где QTableView_obj - виджет QTableView. Реакция нулевая!


Название: Re: Отловить нажатие мыши
Отправлено: Bepec от Апреля 10, 2012, 10:37
Я фшоке. Неужто ты всё запихал в main.cpp?


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 10:41
Я фшоке. Неужто ты всё запихал в main.cpp?
извеняюсь )
писал от руки код)
mainwindow все файлы


Название: Re: Отловить нажатие мыши
Отправлено: Alex Custov от Апреля 10, 2012, 11:31
qApp->installEventFilter установит фильтр глобально, там и отлавливай.


Название: Re: Отловить нажатие мыши
Отправлено: GreatSnake от Апреля 10, 2012, 12:02
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 12:43
qApp->installEventFilter установит фильтр глобально, там и отлавливай.
Разворачивается главная форма - и она просто пустая, ни одного виджета на ней не отобразилось.
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
такая же история - нет виджетов.


Название: Re: Отловить нажатие мыши
Отправлено: Странник от Апреля 10, 2012, 13:01
скорее всего, eventFilter неправильно написали - события дальше не передаются. попробуйте
Код:
return false;


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 13:06
скорее всего, eventFilter неправильно написали - события дальше не передаются. попробуйте
Код:
return false;
Хмм ну да )
Я писал наоборот
Код:
return true;
Спасибо всё заработало evenFilter
Не разобрался правда с
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
попробывал и
Код:
return false;
эффект остался прежним (


Название: Re: Отловить нажатие мыши
Отправлено: V1KT0P от Апреля 10, 2012, 13:16
qApp->installEventFilter установит фильтр глобально, там и отлавливай.
Разворачивается главная форма - и она просто пустая, ни одного виджета на ней не отобразилось.
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
такая же история - нет виджетов.
Каких именно?
Попробовал ловит отлично(в данном случае переименовывает все кнопки):
Код
C++ (Qt)
bool MyApplication::notify(QObject *receiver, QEvent *e)
{
   qDebug() << receiver->objectName();
   QPushButton *button = qobject_cast<QPushButton*>(receiver);
   if (button)
       button->setText("Work!");
   QApplication::notify(receiver, e);
}
 


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 13:20
qApp->installEventFilter установит фильтр глобально, там и отлавливай.
Разворачивается главная форма - и она просто пустая, ни одного виджета на ней не отобразилось.
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
такая же история - нет виджетов.
Каких именно?
Попробовал ловит отлично(в данном случае переименовывает все кнопки):
Код
C++ (Qt)
bool MyApplication::notify(QObject *receiver, QEvent *e)
{
   qDebug() << receiver->objectName();
   QPushButton *button = qobject_cast<QPushButton*>(receiver);
   if (button)
       button->setText("Work!");
   QApplication::notify(receiver, e);
}
 
Всех. Есть главная форма, её заголовок и всё. причём сама функция внутри пустая у меня
Код:
bool QApplication::notify(QObject *obj, QEvent *event)
{
    return false;
}


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 13:22
notify родительского класса стоит вызвать


Название: Re: Отловить нажатие мыши
Отправлено: V1KT0P от Апреля 10, 2012, 13:25
Всех. Есть главная форма, её заголовок и всё. причём сама функция внутри пустая у меня
У меня ловит даже то о чем я и не подозревал(плюс еще какие-то безымянные объекты):
Цитировать
"Test_Widget_Click"
"windowsxp"
"qt_rubberband"
"qt_toolbar_ext_button"
"Qt internal tablet widget"
"xp_limbo_widget"
"xp_limbo_widget"
"centralWidget"
"pushButton"
"pushButton_2"
"pushButton_3"
"menuBar"
"mainToolBar"
"statusBar"
"MainWindow"
Что ты хочешь сделать я не пойму?


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 13:31
notify родительского класса стоит вызвать
QWidget?
QWainWindow?
У них нету данной функции.


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 13:36
notify родительского класса стоит вызвать
QWidget?
QWainWindow?
У них нету данной функции.

Код:
bool QApplication::notify(QObject *obj, QEvent *event)
{
    return false;
}
чтобы переопределить эту фунцию, ты должен был отнаследоваться от QApplication. Если не отнаследовался, то ты сделал фигню. Если отнаследовался, то надо вызвать QApplication::notify(obj, event) как в примере V1KT0P


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 13:37
Всех. Есть главная форма, её заголовок и всё. причём сама функция внутри пустая у меня
У меня ловит даже то о чем я и не подозревал(плюс еще какие-то безымянные объекты):
Цитировать
"Test_Widget_Click"
"windowsxp"
"qt_rubberband"
"qt_toolbar_ext_button"
"Qt internal tablet widget"
"xp_limbo_widget"
"xp_limbo_widget"
"centralWidget"
"pushButton"
"pushButton_2"
"pushButton_3"
"menuBar"
"mainToolBar"
"statusBar"
"MainWindow"
Что ты хочешь сделать я не пойму?
Я хотел отловить клик мыши, по любой области главного окна (есть ли там виджет или нет), и саму информацию о клике (на каком виджете произошёл клик)
при помощи
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
...
qApp->installEventFilter(this);
....
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if ((event->type() == QEvent::MouseButtonPress)&&(obj == ui->Mnemo)&&(FixFlag))
    {
        ....
    }
    return false;
}
всё прошло на УРА!
а если вызываю
Код:
bool QApplication::notify(QObject *obj, QEvent *event)
{
    if ((event->type() == QEvent::MouseButtonPress))
    {
        QMessageBox mes;
        mes.setText(obj->objectName());
        mes.exec();
    }
    return false;
}
Пустая форма


Название: Re: Отловить нажатие мыши
Отправлено: V1KT0P от Апреля 10, 2012, 13:39
Пустая форма
В аттаче проект, посмотри его, запусти. И если все также непонятно, то объясни что именно.


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 13:45
Пустая форма
В аттаче проект, посмотри его, запусти. И если все также непонятно, то объясни что именно.
Всё понял, да я не унаследовался от QApplication поэтому не получалось. А создавать ещё один класс для унаследования, для меня не очень удобное решение, как и меня родителя для mainwindow. Воспользуюсь вторым методом. Впринципе он меня полностью удовлетворил.
Всем спасибо.


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 13:46
Пустая форма
В аттаче проект, посмотри его, запусти. И если все также непонятно, то объясни что именно.
Всё понял, да я не унаследовался от QApplication поэтому не получалось. А создавать ещё один класс для унаследования, для меня не очень удобное решение, как и меня родителя для mainwindow. Воспользуюсь вторым методом. Впринципе он меня полностью удовлетворил.
Всем спасибо.

А как ты вообще собирался переопределять метод без наследования?


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:03
Пустая форма
В аттаче проект, посмотри его, запусти. И если все также непонятно, то объясни что именно.
Всё понял, да я не унаследовался от QApplication поэтому не получалось. А создавать ещё один класс для унаследования, для меня не очень удобное решение, как и меня родителя для mainwindow. Воспользуюсь вторым методом. Впринципе он меня полностью удовлетворил.
Всем спасибо.

А как ты вообще собирался переопределять метод без наследования?
Прост не подумал ...


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:07
Столкнулся со следующей проблемой. События то я получаю типа QEvent, и определяю что это нажатие мыши. А вот координат в QEvent нету:(
Можно ли имея Event и зная что это QMouseEvent узнать непосредственно координаты курсора? Или просто в момент когда будит поймано событие Event  узнать координаты мыши на момент, совершения Event'а?


Название: Re: Отловить нажатие мыши
Отправлено: V1KT0P от Апреля 10, 2012, 14:11
Столкнулся со следующей проблемой. События то я получаю типа QEvent, и определяю что это нажатие мыши. А вот координат в QEvent нету:(
Можно ли имея Event и зная что это QMouseEvent узнать непосредственно координаты курсора? Или просто в момент когда будит поймано событие Event  узнать координаты мыши на момент, совершения Event'а?
Ну дык используй qobject_cast как в примере что я выложил.


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:18
Столкнулся со следующей проблемой. События то я получаю типа QEvent, и определяю что это нажатие мыши. А вот координат в QEvent нету:(
Можно ли имея Event и зная что это QMouseEvent узнать непосредственно координаты курсора? Или просто в момент когда будит поймано событие Event  узнать координаты мыши на момент, совершения Event'а?
Ну дык используй qobject_cast как в примере что я выложил.
Эмм... то ли я туплю то ли хз )
но не пойму чем мне поможет функция, возвращающая ссылку на объект по его имени ?
Или я что-то не так понял ?:)


Название: Re: Отловить нажатие мыши
Отправлено: Bepec от Апреля 10, 2012, 14:21
Код:
QMouseEvent* myEvent = qobject_cast<QMouseEvent*>(event);
QPoint position = myEvent->pos();

Как то так, возможно неверно, написано на тополе.


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:23
Столкнулся со следующей проблемой. События то я получаю типа QEvent, и определяю что это нажатие мыши. А вот координат в QEvent нету:(
Можно ли имея Event и зная что это QMouseEvent узнать непосредственно координаты курсора? Или просто в момент когда будит поймано событие Event  узнать координаты мыши на момент, совершения Event'а?
Ну дык используй qobject_cast как в примере что я выложил.
А вообще очень интересная функция =)
Вопрос немножко не по теме.
Если я опишу свой класс. Объявлю два объекта этого класса, допусти в двух вдругих классах, и имена им дам одинаковые. Эта функция вернёт оба этих объекта ? :)


Название: Re: Отловить нажатие мыши
Отправлено: V1KT0P от Апреля 10, 2012, 14:23
Код:
QMouseEvent* myEvent = qobject_cast<QMouseEvent*>(event);
QPoint position = myEvent->pos();

Как то так, возможно неверно, написано на тополе.
Не, оказывается эвент не наследуется от кьюобжекта. Надо так:
Код
C++ (Qt)
if (e->type() == QEvent::MouseButtonPress) {
   QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
   qDebug() << mouseEvent->pos();
}


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:26
Код:
QMouseEvent* myEvent = qobject_cast<QMouseEvent*>(event);
QPoint position = myEvent->pos();

Как то так, возможно неверно, написано на тополе.
не поверишь реализовал сразу же
Код:
QMouseEvent * ev = qobject_cast <QMouseEvent *>(event);
в ответ получил "нет соответствующей функции для вызова «qobject_cast(QEvent*&)»"


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:28
Код:
QMouseEvent* myEvent = qobject_cast<QMouseEvent*>(event);
QPoint position = myEvent->pos();

Как то так, возможно неверно, написано на тополе.
Не, оказывается эвент не наследуется от кьюобжекта. Надо так:
Код
C++ (Qt)
if (e->type() == QEvent::MouseButtonPress) {
   QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
   qDebug() << mouseEvent->pos();
}
во во и я про тоже Event - это QtCore,а MouseEvet - это QtGui


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:31
Всё получилось - спасибо большое  V1KT0P!
И просто замечательно что я познакомился с функциями static_cast и qobject_cast  :)


Название: Re: Отловить нажатие мыши
Отправлено: kambala от Апреля 10, 2012, 14:53
И просто замечательно что я познакомился с функциями static_cast
было бы просто замечательно, если бы знакомство начинали с С++, а не сразу бежали окошки рисовать


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 14:56
И просто замечательно что я познакомился с функциями static_cast
было бы просто замечательно, если бы знакомство начинали с С++, а не сразу бежали окошки рисовать
Не всё в жизни получается так, как надо. Обстоятельства заставляют ...
Я бы сам рад - сначала изучить на твёрдую пятёрку плюсы, потом буравить Qt, но увы... времени и на изучение одного и реализацию в другом не хватает. Приходиться навёрстывать по пути.


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 15:28
Ну дык используй qobject_cast как в примере что я выложил.
А вообще очень интересная функция =)
Вопрос немножко не по теме.
Если я опишу свой класс. Объявлю два объекта этого класса, допусти в двух вдругих классах, и имена им дам одинаковые. Эта функция вернёт оба этих объекта ? :)

Щито?? какая связь между именами объектов и qobject_cast?


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 15:46
Returns the given object cast to type T if the object is of type T
Код:
Example:

 QObject *obj = new QTimer;          // QTimer inherits QObject

 QTimer *timer = qobject_cast<QTimer *>(obj);
 // timer == (QObject *)obj

 QAbstractButton *button = qobject_cast<QAbstractButton *>(obj);
 // button == 0


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 15:56
Ну вообще-то она приводит объект к типу, если объект действительного этого типа. А уж никак не возвращает объект по имени...


Название: Re: Отловить нажатие мыши
Отправлено: bez_glaz от Апреля 10, 2012, 16:03
Ну вообще-то она приводит объект к типу, если объект действительного этого типа. А уж никак не возвращает объект по имени...
Не буду спорить, я уже знаю где я опробую данную функцию и отпишусь тут по результатам моих тестов:)


Название: Re: Отловить нажатие мыши
Отправлено: mutineer от Апреля 10, 2012, 16:07
Ну вообще-то она приводит объект к типу, если объект действительного этого типа. А уж никак не возвращает объект по имени...
Не буду спорить, я уже знаю где я опробую данную функцию и отпишусь тут по результатам моих тестов:)

Ну опробуй, раз не хочешь осознать написанное в доке...