Russian Qt Forum

Qt => Общие вопросы => Тема начата: karp2005 от Август 03, 2006, 15:06



Название: Ошибка с KeyPress!
Отправлено: karp2005 от Август 03, 2006, 15:06
Может кто сталкивался - не могу понять это баг или моя криворукость. Следующий текст:

if ( e->type() == QEvent::KeyPress ) {
             .....
       }

получаем такую ошибку:
 error: expected unqualified-id before numeric constant
 error: expected `)' before numeric constant

При таком варианте
if ( e->type() == 6 ) {    // взял значение константы из qevent.h  
             .....
       }

или таком:

  if ( e->type() == QEvent::Wheel) {  
             .....
       }

Всё работает... В заголовках #include <qevent.h> есть...В чём может быть проблемма? Испрльзую Qt 3.3.4


Название: Re: Ошибка с KeyPress!
Отправлено: QCasper от Август 03, 2006, 15:49
Цитата: "karp2005"
Может кто сталкивался - не могу понять это баг или моя криворукость. Следующий текст:

if ( e->type() == QEvent::KeyPress ) {
             .....
       }

получаем такую ошибку:
 error: expected unqualified-id before numeric constant
 error: expected `)' before numeric constant

При таком варианте
if ( e->type() == 6 ) {    // взял значение константы из qevent.h  
             .....
       }

или таком:

  if ( e->type() == QEvent::Wheel) {  
             .....
       }

Всё работает... В заголовках #include <qevent.h> есть...В чём может быть проблемма? Испрльзую Qt 3.3.4


я в четверке, у меня все ок. Посмотри еще раз, мож где очепятка в коде. Или еще может конфликт какой, хотя пространство имен явно указано... странно конечно.


Название: Ошибка с KeyPress!
Отправлено: Hordi от Август 03, 2006, 16:25
попробуй пробелы убрать - может невидимый символ какой. Синтаксичекси все верно - у меня аналогичный код в проектах начиная с самых первых версий работает.


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 24, 2009, 19:13
У меня такая же проблема при сборке под линуксом (qt 4.3.4 opensource).
тот же код в винде собирается нормально и студией, и креатором.
Имхо баг линуксовой сборки кути...



Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 24, 2009, 19:35
По теме. Макросы - зло. KeyPress - дефайн в заголовочниках иксов. Каким образом вылез наружу - ищите у себя в коде. Скорее всего потому что заголовочники иксов включены после заголовочников Qt, нужно наоборот. Об этом где-то писалось.

Мысли вслух. Смотрю на даты постов и думаю что неплохо было бы закрыть темы полугодичной давности.


Название: Re: Ошибка с KeyPress!
Отправлено: lit-uriy от Январь 24, 2009, 22:00
Мысли вслух. Смотрю на даты постов и думаю что неплохо было бы закрыть темы полугодичной давности.
ну и зря, а если проблема почти таже? А в исходных постах нет ее решения?


Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 24, 2009, 22:06
Цитировать
ну и зря, а если проблема почти таже? А в исходных постах нет ее решения?

Это скорее исключение, чем правило. Можно в новой теме сделать ссылку на предыдущую. Или попросить открыть её модератором.


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 24, 2009, 22:46
Дата темы имхо говорит о том, что проблема до сих пор не была пофикшена (да, кути 4.4.3, а не 4.3.4 - перепутал).
Инклуды пытался местами менять - не помогает.


Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 24, 2009, 22:51
Так это у вас в собственном коде, я правильно понял? Кют сама собирается нормально? Пример кода можно?


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 24, 2009, 23:50
код в общем такой:

Код
C++ (Qt)
bool MyForm::eventFilter(QObject *obj, QEvent *event)
{
   switch (event->type())
   {
       case 8: // QEvent::FocusIn:
           break;
 
     case 6: // QEvent::KeyPress:
       break;
 
       case 7: // QEvent::KeyRelease:
         break;
 
       default:;
   }
 
 
   // standard event processing
   return QWidget::eventFilter(obj, event);
}
 
 

Этот свитч компилируется только с закоменченными кодами эвентов.

Вообще после гугления понял, что у многих такая лажа и это как то связано с конфликтами с NetWM. Правда, решение предлагают только одно - как собственно и сделано у меня :(


Название: Re: Ошибка с KeyPress!
Отправлено: pastor от Январь 25, 2009, 00:00
Проблема 100% в приложении. Была уже такая ошибка но с учаснием мотифа. Помогла перестановка инклудов: все кутишные инклуды были поставлены первыми, затем мотифа. Если проект большой, то это давольно кропотливая работа, т.к. проблемное место может находится далеко от файла с ошибкой.


Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 25, 2009, 00:39
2 Racheengel

Да, сам напарывался на эти грабли в прошлом. Вот только уже не припомню что именно я инклудил и как решал.
Я вас обманул, заголовочник Qt (например, #include <qtglobal.h>) должен идти самым первым, вот что он содержит в итоге:

qt_x11_p.h
Код
C++ (Qt)
#if defined(_XLIB_H_) // crude hack, but...
#error "cannot include <X11/Xlib.h> before this file"
#endif
 
...
 
// rename a couple of X defines to get rid of name clashes
// resolve the conflict between X11's FocusIn and QEvent::FocusIn
enum {
   XFocusOut = FocusOut,
   XFocusIn = FocusIn,
   XKeyPress = KeyPress,
   XKeyRelease = KeyRelease,
   XNone = None,
   XRevertToParent = RevertToParent,
   XGrayScale = GrayScale,
   XCursorShape = CursorShape
};
#undef FocusOut
#undef FocusIn
#undef KeyPress
#undef KeyRelease
#undef None
#undef RevertToParent
#undef GrayScale
#undef CursorShape
 

Он инклудит Xlib.h первым, тем самым предотвращая его препроцессинг при включении в собственном коде из-за ограждающих дефайнов.
После этого он андефит горе-макросы, делая им замену в виде перечисления, если в собственном коде нужно будет их использовать.


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 25, 2009, 02:11
хм, судя по всему - можно попробовать просто заандефить макросы и потом уже заинклудить QtGui...
надо будет попробовать, спасибо за наводку.


Название: Re: Ошибка с KeyPress!
Отправлено: Alex Custov от Январь 25, 2009, 03:17
достаточно X заголовки включать после Qt-шных. NetWM тут наверное всё-таки ни при чём :)


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 31, 2009, 02:35
не, не помогает...


Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 31, 2009, 04:11
Дак понятно что не помогает. Если бы ограждающий дефайн _XLIB_H_ был бы определён - о перестановке инклудов вам бы крикнул этот же еррор:

Код:
#error "cannot include <X11/Xlib.h> before this file"

Еррор молчит, значит перестановка инклудов не поможет. Ищите по своим системным заголовочникам где ещё определён KeyPress (#define KeyPress).


Название: Re: Ошибка с KeyPress!
Отправлено: Dendy от Январь 31, 2009, 04:39
Хм. Только что посмотрел в своих собственных заголовочниках. Похоже что еррор молчит потому что заголовочник с #undef KeyPress попросту отсутствует в инсталляции. По всей видимости он используется только для внутренней реализации самой Qt. Значит в своём собственном коде прийдётся делать собственный воркероунд и инклудить его в каждом проблемном файле:

Код
C++ (Qt)
#ifndef _MY_X_WORKAROUND_
#define _MY_X_WORKAROUND_
 
#if defined(KeyPress)
 
enum {
   XFocusOut = FocusOut,
   XFocusIn = FocusIn,
   XKeyPress = KeyPress,
   XKeyRelease = KeyRelease,
   XNone = None,
   XRevertToParent = RevertToParent,
   XGrayScale = GrayScale,
   XCursorShape = CursorShape
};
#undef FocusOut
#undef FocusIn
#undef KeyPress
#undef KeyRelease
#undef None
#undef RevertToParent
#undef GrayScale
#undef CursorShape
 
#endif
 
#endif


Название: Re: Ошибка с KeyPress!
Отправлено: Racheengel от Январь 31, 2009, 15:03
Да уж, костылять так костылять :)))
Хорошо что у меня такой файл тока один...