crossplatform.ru

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

3 страниц V  < 1 2 3  
Ответить в данную темуНачать новую тему
> Переопределение функции keyPressEvent для определенного виджета
kwisp
  опции профиля:
сообщение 25.3.2010, 10:21
Сообщение #21


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(AD @ 25.3.2010, 9:59) *
Какой глобальный фильтр событий? Где он должен быть? Как его вызвать?

кто то первый раз за мужем.
если не ошибаюсь если в QApplication переопределить фильтр событий то он будет глобальным для всего приложения. :)
как ты можешь быть уверен что setFocus() вызванный в конструкторе , гарантирует сохранность фокуса ввода после получения окном события отрисовки, нажатия клавиш мыша таба?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.3.2010, 10:29
Сообщение #22


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 25.3.2010, 10:21) *
если не ошибаюсь если в QApplication переопределить фильтр событий то он будет глобальным для всего приложения. :)

Я ведь его уже привел?!!!. Я переопределил эту функцию в классе, который является наследником QMainWindow. Повторюсь, не помогает

Цитата(kwisp @ 25.3.2010, 10:21) *
как ты можешь быть уверен что setFocus() вызванный в конструкторе , гарантирует сохранность фокуса ввода после получения окном события отрисовки, нажатия клавиш мыша таба?
А где тогда это сделать? Куда ткнуть вызов этой функции?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.3.2010, 10:37
Сообщение #23


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


AD,
и я повторюсь. Попробуй унаследоваться от QApplication переопределить в этом классе фильтр событий!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.3.2010, 11:27
Сообщение #24


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


А что по поводу фокуса ввода? Можно какой-нибудь маленький примерчик?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.3.2010, 13:26
Сообщение #25


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(AD @ 25.3.2010, 11:27) *
А что по поводу фокуса ввода? Можно какой-нибудь маленький примерчик?

ну напиши сам маленький тестик. посомотри как фокус ввода меняется.
набери в асситенте Keyboard Focus.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.3.2010, 15:45
Сообщение #26


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Не удается такой финт ушами. :(
Реально, нужна помощь для того, чтобы разобраться.... Я не понимаю, как еще надо переопределить этот класс:
main.h
#ifndef MAIN_H_05555
#define MAIN_H_05555

/// Класс переопределения фильтра событий
class Application: public QApplication
{
    Q_OBJECT

protected:
    bool eventFilter(QObject* object, QEvent* events);

public:
    Application(int& argc, char** argv): QApplication(argc, argv) {}
    ~Application() {}
};

#endif //MAIN_H_05555


main.cpp
#include <QtGui/QApplication>
#include <QtGui>

#include "LibraryBuilder.h"
#include "main.h"

/// Фильтрация событий
bool Application::eventFilter(QObject* object, QEvent* events)
{
    bool p1 = true;
    if(events -> type() == QEvent::KeyPress)
    {
        QKeyEvent* key_events(static_cast<QKeyEvent*> (events));
        switch(key_events -> key())
        {
        case Qt::Key_Plus:
            p1 = false;
        break;
        case Qt::Key_Minus:
        break;
        }
        return QApplication::eventFilter(object, events);
    }

    return QApplication::eventFilter(object, events);
}

/// Главная функция запуска приложения
int main(int argc, char *argv[])
{
    Application a(argc, argv);
    LibraryBuilder w;
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}


Выдаются следующие ошибки:
Цитата
main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Application::metaObject(void)const " (?metaObject@Application@@UBEPBUQMetaObject@@XZ)
main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Application::qt_metacast(char const *)" (?qt_metacast@Application@@UAEPAXPBD@Z)
main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Application::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Application@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.3.2010, 16:06
Сообщение #27


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


вопрос не по теме по-моему.
попробуй вынести вынеси интерфейс и реализацию в application.h application.cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 25.3.2010, 16:43
Сообщение #28


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kwisp @ 25.3.2010, 16:06) *
вопрос не по теме по-моему.

Еще как по теме. Ни к какой другой теме он не относится. Тот же самый фильтр событий.

Цитата(kwisp @ 25.3.2010, 16:06) *
попробуй вынести вынеси интерфейс и реализацию в application.h application.cpp

Попробую.

Хм... Приложение вообще не попадает в эту функцию....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.3.2010, 13:36
Сообщение #29


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

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Удалось попасть в глобальный фильтр событий, но для этого надо было добавить следующую строчку кода в main:
a.installEventFilter(&a);


Блин. Все-таки стоит ассистент читать внимательно. :) Вот эта фраза помогла сделать правильное переопределение на нужный виджет функции keyEventPress:
Цитата
void QWidget::keyPressEvent ( QKeyEvent * event ) [virtual protected]
This event handler, for event event, can be reimplemented in a subclass to receive key press events for the widget.
A widget must call setFocusPolicy() to accept focus initially and have focus in order to receive a key press event.
If you reimplement this handler, it is very important that you ignore() the event if you do not understand it, so that the widget's parent can interpret it.
The default implementation closes popup widgets if the user presses Esc. Otherwise the event is ignored.

Вызвал функцию setFocusPolicy
setFocusPolicy(Qt::StrongFocus);
, что и помогло. Фильтр событий вообще не понадобился.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 27.11.2024, 13:38