Russian Qt Forum

Qt => Qt Embedded => Тема начата: lisarden от Апрель 01, 2011, 23:10



Название: как переопределить qwsEventFilter?
Отправлено: lisarden от Апрель 01, 2011, 23:10
Никак не могу разобраться каким образом можно определить qwsEventFilter! Перерыл весь инет, но результата нет.

Помогите какие-нибудь примером или советом


Название: Re: как переопределить qwsEventFilter?
Отправлено: madRoger от Апрель 01, 2011, 23:35
Может сначала поупражняться с обычным eventFilter. Суть та одна.


Название: Re: как переопределить qwsEventFilter?
Отправлено: lisarden от Апрель 01, 2011, 23:54
с этим я уже упражнялся. Он садится на какой-нибудь виджет и далее всё просто. А мне нужно не на виджет а на всю апликуху.

Сделал так:
myapp.h
Код:
class MyApp : public QApplication
{
public:
    MyApp(int &argc, char **argv ) : QApplication( argc, argv ) {};

    bool qwsEventFilter(QWSEvent * event);
};
myapp.cpp
Код:
#include "myapp.h"

bool MyApp::qwsEventFilter(QWSEvent *e)
{
    if(e->type == QEvent::KeyPress) {
        qDebug("pressed");
    }
    else if (e->type == QEvent::KeyRelease ) {
        qDebug("released");
    }
    return false;
}

main.c
Код:
#include <QtGui/QApplication>
#include "myapp.h"
#include "qt-linphone.h"

int main(int argc, char *argv[])
{
    MyApp a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

Не пишутся на консоль эти "pressed"/"released". Что не так?


Название: Re: как переопределить qwsEventFilter?
Отправлено: madRoger от Апрель 01, 2011, 23:59
Цитировать
e->type == QEvent::KeyPress
Вы сравниваете разные типы. Попробуйте e->type() ==QWSEvent::Key

UPD: Если использовать e->type() ==QWSEvent::Key , то, судя по документации, можно определить только активность клавиш. Но разобрать, нажата или отпущена клавиша не получится.
Можно преобразовать тип QWSEvent к QEvent так: QEvent *event = (QEvent *)e;
Тогда можно сравнивать как у вас в коде, то есть можно определить момент нажатия и момент отпускания.
if(event->type() == QEvent::KeyPress)
{......и так далее

Саму клавишу можно определить аналогично:
QKeyEvent *keyEvent = (QKeyEvent *)e;
        if( keyEvent->key() == Qt::Key_Return )
       {... и так далее.

Сам не проверял, предполагаю исходя из доков.


Название: Re: как переопределить qwsEventFilter?
Отправлено: lisarden от Апрель 02, 2011, 09:10
предположим, что с ивентами я не правильно работаю. Но если вставить отладку без условий, то в этот обработчик вообще исполнение не попадает.

я тут подумал, что проблема в версии Qt: ведь она у меня комповая, а не Qt-embedded. Может qws и не должен вовсе работать?


Название: Re: как переопределить qwsEventFilter?
Отправлено: madRoger от Апрель 02, 2011, 11:16
Возможно, проблема с версией и настройками Qt. Раньше embedded linux надо было качать отдельно. Насколько я помню, библиотека qt с поддержкой всего и вся пошла с 4.6.0. У нее в названии был префикс everywhere. И конечно же необходимо правильно настроить библиотеку. Советую обратиться к офф.сайту, там есть инфа.

http://doc.qt.nokia.com/latest/qt-embedded-install.html (http://doc.qt.nokia.com/latest/qt-embedded-install.html)
http://doc.qt.nokia.com/latest/qws.html (http://doc.qt.nokia.com/latest/qws.html)

Скачать можно из архива на ftp nokia: ftp.qt.nokia.com/qt/source/


Название: Re: как переопределить qwsEventFilter?
Отправлено: lisarden от Апрель 02, 2011, 13:48
Действительно, после того, как руками собрал библиотеку компилятором arm-linux-gnueabi и запустил на арме, то обработчик вида:

Код:
bool MyApp::qwsEventFilter(QWSEvent *e)
{
    if(e->type == QWSEvent::Key) {
        qDebug("key");
    }
    return false;
}
заработал. Буду дальше копать..