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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Отловить нажатие мыши  (Прочитано 18980 раз)
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. Реакция нулевая!
« Последнее редактирование: Апрель 10, 2012, 10:42 от bez_glaz » Записан
Bepec
Гость
« Ответ #1 : Апрель 10, 2012, 10:37 »

Я фшоке. Неужто ты всё запихал в main.cpp?
Записан
bez_glaz
Гость
« Ответ #2 : Апрель 10, 2012, 10:41 »

Я фшоке. Неужто ты всё запихал в main.cpp?
извеняюсь )
писал от руки код)
mainwindow все файлы
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Апрель 10, 2012, 11:31 »

qApp->installEventFilter установит фильтр глобально, там и отлавливай.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Апрель 10, 2012, 12:02 »

Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
Записан

Qt 5.11/4.8.7 (X11/Win)
bez_glaz
Гость
« Ответ #5 : Апрель 10, 2012, 12:43 »

qApp->installEventFilter установит фильтр глобально, там и отлавливай.
Разворачивается главная форма - и она просто пустая, ни одного виджета на ней не отобразилось.
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
такая же история - нет виджетов.
« Последнее редактирование: Апрель 10, 2012, 12:45 от bez_glaz » Записан
Странник
Гость
« Ответ #6 : Апрель 10, 2012, 13:01 »

скорее всего, eventFilter неправильно написали - события дальше не передаются. попробуйте
Код:
return false;
Записан
bez_glaz
Гость
« Ответ #7 : Апрель 10, 2012, 13:06 »

скорее всего, eventFilter неправильно написали - события дальше не передаются. попробуйте
Код:
return false;
Хмм ну да )
Я писал наоборот
Код:
return true;
Спасибо всё заработало evenFilter
Не разобрался правда с
Либо перегрузи:
Код
C++ (Qt)
bool QApplication::notify( QObject* receiver, QEvent* e )
попробывал и
Код:
return false;
эффект остался прежним (
Записан
V1KT0P
Гость
« Ответ #8 : Апрель 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);
}
 
Записан
bez_glaz
Гость
« Ответ #9 : Апрель 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;
}
Записан
mutineer
Гость
« Ответ #10 : Апрель 10, 2012, 13:22 »

notify родительского класса стоит вызвать
Записан
V1KT0P
Гость
« Ответ #11 : Апрель 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"
Что ты хочешь сделать я не пойму?
Записан
bez_glaz
Гость
« Ответ #12 : Апрель 10, 2012, 13:31 »

notify родительского класса стоит вызвать
QWidget?
QWainWindow?
У них нету данной функции.
Записан
mutineer
Гость
« Ответ #13 : Апрель 10, 2012, 13:36 »

notify родительского класса стоит вызвать
QWidget?
QWainWindow?
У них нету данной функции.

Код:
bool QApplication::notify(QObject *obj, QEvent *event)
{
    return false;
}
чтобы переопределить эту фунцию, ты должен был отнаследоваться от QApplication. Если не отнаследовался, то ты сделал фигню. Если отнаследовался, то надо вызвать QApplication::notify(obj, event) как в примере V1KT0P
Записан
bez_glaz
Гость
« Ответ #14 : Апрель 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;
}
Пустая форма
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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