Russian Qt Forum

Qt => Общие вопросы => Тема начата: Mashko от Февраль 09, 2010, 20:23



Название: Переопределение keyPressEvent
Отправлено: Mashko от Февраль 09, 2010, 20:23
Подскажите, пожалуйста, решение проблемы!
Есть модуль. В его .cpp вынесены функции, в .h - их прототипы и объявлен статический объект:
Код:
static QTextEdit* textWidget;
 
Для этого объекта нужно переопределить метод keyPressEvent. При моей попытке делать это так:
Код:
//.h 
void textWidget::keyPressEvent(QKeyEvent *event);
//.cpp
void textWidget::keyPressEvent(QKeyEvent *event)
{
   ...
}
Получаю кучу ошибок:
Код:
1.error C2825: 'textWidget': must be a class or namespace when followed by '::'
2.error C2039: 'KeyPressEvent': is not a member of "global  namespace"
3.error C2146: syntax error: missing ';' before identifer 'keyPressEvent'
4.error C2182: 'textWidget': illegal use of type 'void'

Может, кто знает правильное решение


Название: Re: Переопределение keyPressEvent
Отправлено: BRE от Февраль 09, 2010, 20:35
Хорошо бы, что-то по С++ почитать.  ;)


Название: Re: Переопределение keyPressEvent
Отправлено: lit-uriy от Февраль 09, 2010, 20:56
>>нужно переопределить метод keyPressEvent
чтобы переопределить метод какого-то класса, нужно создать наследника (унаследоваться) от этого класса и в новом просто набрать этот метод заново.


Название: Re: Переопределение keyPressEvent
Отправлено: BRE от Февраль 09, 2010, 21:07
Самое главное, что нельзя переопределять метод у конкретного объекта, а можно только у класса.


Название: Re: Переопределение keyPressEvent
Отправлено: Mashko от Февраль 09, 2010, 21:38
Самое главное, что нельзя переопределять метод у конкретного объекта, а можно только у класса.


Так может тогда переопределять сразу у QTextEdit, от которого наследовался textWidget?


Название: Re: Переопределение keyPressEvent
Отправлено: BRE от Февраль 09, 2010, 21:45
Так может тогда переопределять сразу у QTextEdit, от которого наследовался textWidget?

mytextedit.h
Код
C++ (Qt)
class MyTextEdit : public QTextEdit
{
protected:
void keyPressEvent ( QKeyEvent * event );
};
 

mytextedit.cpp
Код
C++ (Qt)
void MyTextEdit::keyPressEvent ( QKeyEvent * event )
{
...
 
// При необходимости вызываем метод предка
// QTextEdit::keyPressEvent( event );
}
 


Название: Re: Переопределение keyPressEvent
Отправлено: lit-uriy от Февраль 09, 2010, 23:32
>>Так может тогда переопределять сразу у QTextEdit, от которого наследовался textWidget?
в приведённом тобою коде:
static QTextEdit* textWidget;
ты просто объявил переменную-указатель textWidget на тип QTextEdit. А не наследовался. См. пример, который привёл BRE. Там именно наследование (т.е. создаётся новый класс MyTextEdit на основе класса QTextEdit)


Название: Re: Переопределение keyPressEvent
Отправлено: Mashko от Февраль 10, 2010, 18:43
Я женского роду, ну да ладно  :D
Так вот, не мучаясь долго переопределила метод keyPressEvent() для всего QTextEdit. Нажатие, например, на Enter ловится, но при этом почему-то пропала возможность ввода текста в textWidget  ???
Код:
void QTextEdit::keyPressEvent(QKeyEvent* event)
{
    switch(event->key())
    {
           case Qt::Key_Return:
                setText("ready");
           break;
           default:
               QWidget::keyPressEvent(event);
     }

}



Название: Re: Переопределение keyPressEvent
Отправлено: BRE от Февраль 10, 2010, 18:55
Написал же - предка.  ;)
Код:
...
           default:
               QTextEdit::keyPressEvent(event);


Название: Re: Переопределение keyPressEvent
Отправлено: lit-uriy от Февраль 10, 2010, 21:32
>>Написал же - предка.
Дак она в исходник Qt забралась

П.С. Ожидаю море постов с описанием неадекватного поведения Qt-виджетов


Название: Re: Переопределение keyPressEvent
Отправлено: break от Февраль 10, 2010, 23:24
оффтоп т.к. по теме даже сказать нечего. Думаю эта тема разовьется старниц на 40 - а все от того что кто-то решил что C++ можно изучить не читая ни одной книги...