crossplatform.ru

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


  Ответ в Переопределение функции keyPressEvent для определенного виджета
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 26.3.2010, 13:36
  Удалось попасть в глобальный фильтр событий, но для этого надо было добавить следующую строчку кода в 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);
, что и помогло. Фильтр событий вообще не понадобился.
AD Дата 25.3.2010, 16:43
 
Цитата(kwisp @ 25.3.2010, 16:06) *
вопрос не по теме по-моему.

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

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

Попробую.

Хм... Приложение вообще не попадает в эту функцию....
kwisp Дата 25.3.2010, 16:06
  вопрос не по теме по-моему.
попробуй вынести вынеси интерфейс и реализацию в application.h application.cpp
AD Дата 25.3.2010, 15:45
  Не удается такой финт ушами. :(
Реально, нужна помощь для того, чтобы разобраться.... Я не понимаю, как еще надо переопределить этот класс:
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, 13:26
 
Цитата(AD @ 25.3.2010, 11:27) *
А что по поводу фокуса ввода? Можно какой-нибудь маленький примерчик?

ну напиши сам маленький тестик. посомотри как фокус ввода меняется.
набери в асситенте Keyboard Focus.
AD Дата 25.3.2010, 11:27
  А что по поводу фокуса ввода? Можно какой-нибудь маленький примерчик?
kwisp Дата 25.3.2010, 10:37
  AD,
и я повторюсь. Попробуй унаследоваться от QApplication переопределить в этом классе фильтр событий!
AD Дата 25.3.2010, 10:29
 
Цитата(kwisp @ 25.3.2010, 10:21) *
если не ошибаюсь если в QApplication переопределить фильтр событий то он будет глобальным для всего приложения. :)

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

Цитата(kwisp @ 25.3.2010, 10:21) *
как ты можешь быть уверен что setFocus() вызванный в конструкторе , гарантирует сохранность фокуса ввода после получения окном события отрисовки, нажатия клавиш мыша таба?
А где тогда это сделать? Куда ткнуть вызов этой функции?
kwisp Дата 25.3.2010, 10:21
 
Цитата(AD @ 25.3.2010, 9:59) *
Какой глобальный фильтр событий? Где он должен быть? Как его вызвать?

кто то первый раз за мужем.
если не ошибаюсь если в QApplication переопределить фильтр событий то он будет глобальным для всего приложения. :)
как ты можешь быть уверен что setFocus() вызванный в конструкторе , гарантирует сохранность фокуса ввода после получения окном события отрисовки, нажатия клавиш мыша таба?
AD Дата 25.3.2010, 9:59
 
Цитата(kwisp @ 25.3.2010, 8:27) *
от куда ты знаешь где фокус будет после создания окна нажатия на кнопки мыши и таб.?
что с глобальным фильтром событий?

Можно по русски? Прости, нифига не понял. Какой глобальный фильтр событий? Где он должен быть? Как его вызвать?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 14:27