Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: TranE91 от Апрель 30, 2011, 18:56



Название: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Апрель 30, 2011, 18:56
И вновь мои надоедливые вопросики.
Пишу свой виджет, структура получается такая:
Код
C++ (Qt)
class Track: public QWidget
{
QList<Takt> list_takt;
}
class Takt: public QWidget//наследник Track
{
QList<Position> list_position;
}
class Position:public QWidget //наследник Track
 
ну и в третьем классе я пытаюсь реализовать отслеживание нажатия кнопочки:
Код
C++ (Qt)
#ifndef Position_H
#define Position_H
 
#include "headers.h"
 
class Position: public QWidget
{
   Q_OBJECT
public:
   // Конструктор
  explicit Position(
          QWidget  *this_track_transfered,          
          int position_transfered,
          bool pause_transfered = false,
          unsigned short int dimensions_transfered = 6,
          unsigned short int strn_1_transfered = 80,
          unsigned short int strn_2_transfered = 80,
          unsigned short int strn_3_transfered = 80,
          unsigned short int strn_4_transfered = 80,
          unsigned short int strn_5_transfered = 80,
          unsigned short int strn_6_transfered = 80 );
 
   //Обязательные функции реализации визуализации
   void paintEvent();
   QSize sizeHint() const;
 
   QString note_to_str(unsigned short int note);    
   void keyPressEvent(QKeyEvent *event);
 
  //get функции
   int get_pos();
 
private slots:
   void update();
   void set_strn_1(QString note);
   void set_strn_2(QString note);
   void set_strn_3(QString note);
   void set_strn_4(QString note);
   void set_strn_5(QString note);
   void set_strn_6(QString note);
   void set_dim_up();
   void set_dim_down();
   void set_pause();
   void check_pause();
 
 
   //Переменные
private:
   bool pause; //если true, ставим паузу
   unsigned short int strn_1; // нотка на данной струне (0-24 ноты) (80 -  пустота)
   unsigned short int strn_2;
   unsigned short int strn_3;
   unsigned short int strn_4;
   unsigned short int strn_5;
   unsigned short int strn_6;
   unsigned short int dimensions; // размерность нот на данной позиции {0 - 5} <=> целая - 32-ая, 6 - никакая
   int position; // последняя Иксовая позиция*/
 
   QWidget *buff_widget;
   QPainter *painter;
   QLineEdit *s1;
   QLineEdit *s2;
   QLineEdit *s3;
   QLineEdit *s4;
   QLineEdit *s5;
   QLineEdit *s6;
};
 
#endif // Position_H
 
ну и сама реализация keyPressEvent:
Код
C++ (Qt)
void Position::keyPressEvent(QKeyEvent *event)
{
   switch(event->key())
   {
   case Qt::Key_Plus:
       {
       set_dim_up();
       qDebug()<<"Plus_pressed"<<endl;
       break;
       }
   case Qt::Key_Minus:
       {
       set_dim_down();
       qDebug()<<"Minus_pressed"<<endl;
       break;
       }
   }
}
 
ну и естественно, как вы наверное уже догадались, ОНИ НЕ РАБОТАЮТ!!! Даже дебаггер не ловит их.
В чем может быть траБЛЯ?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Апрель 30, 2011, 21:33
А фокус ввода установлен во время нажатия клавиш?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 01, 2011, 00:43
Эмммм...... хорошо, допустим я установил фокус на этот виджет. Но при добавлении еще одного поля Position на общую форму Track у меня, получается, будут генериться два фокуса одновременно или я ошибаюсь?
Да и еще один вопрос, как переопределить нажатие клапиш во вложенных в этот виджет стд. классов QLineEdit, т.е. чтобы во время добавления своих ноток можно было бы менять размерность клавишами + - ?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 01, 2011, 08:53
Это кусок твоего кода

Цитировать
public:
    // Конструктор
   explicit Position(
           QWidget  *this_track_transfered,           
  ............
    void keyPressEvent(QKeyEvent *event);

у тебя слот keyPressevent определен в секции паблик

это из справки:
Код:
void QWidget::keyPressEvent ( QKeyEvent * event ) [virtual protected]

тут четко написано что эта функция виртуальная защищенная. По-этому оределять ее надо в секции
protected:

а ты просто сделал новую функцию котороя никакого отношения к переопределению нажатия клавиш не имеет.
Это вы неправильно сказали!


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 01, 2011, 09:01
Эмммм...... хорошо, допустим я установил фокус на этот виджет. Но при добавлении еще одного поля Position на общую форму Track у меня, получается, будут генериться два фокуса одновременно или я ошибаюсь?
Вы можете обрабатывать нажатия в одном месте. См. void QObject::installEventFilter ( QObject * filterObj ).

Да и еще один вопрос, как переопределить нажатие клапиш во вложенных в этот виджет стд. классов QLineEdit, т.е. чтобы во время добавления своих ноток можно было бы менять размерность клавишами + - ?
Опять же можно использовать QObject::installEventFilter ( QObject * filterObj ).


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 01, 2011, 18:36
Спасибо приогромное. Помогло. Теперь столкнулся с другой проблемой)
Забиндил клавишу P, но когда стоит русская раскладка, то меня посылают в места не столь отдаленные, эта проблема обходима?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 01, 2011, 19:59
А вам что надо? Чтобы при любой раскладке клавы отрабатвал один и тот же блок?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 01, 2011, 20:26
Да, именно оно.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 01, 2011, 20:36
Возможно это не совсем изящно, но можно смотреть текст евента, QString QKeyEvent::text () const.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 02, 2011, 01:35
Сэнкс биг. Тут что, дают ответы на все вопросы?)


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 02, 2011, 15:20
Сэнкс биг. Тут что, дают ответы на все вопросы?)
Ну это же форум ;) Я так понмаю, что вы дклаете что-то типа редкатора? Тогда лучше использовать каркас QGraphics... Если хотите виджет воткнуть, то есть класс QGraphicsProxyWidget.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 02, 2011, 15:29
Хорошо, а при написании Плугина, все отлично прокатит, т.е. мне нужно будет это все в дизайнер добавить еще.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 02, 2011, 20:03
Зачем плагин? Можно проще через Promote to...


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 03, 2011, 03:49
Что-то несовсем я понял возможности QGraphicsProxyWidget. Не могли бы пояснить?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 03, 2011, 08:31
Есть сцена, на сцене есть куча айтемов (можно унаследоваться от QGraphicsItem и рисовать что угодно), а также можно на сцену добавлять обычные виджеты через QGraphicsProxyWidget.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 03, 2011, 17:54
Хорошо, а что с интеграцией в Дизайнер. Я так понимаю, что мой самый главный класс должен наследоваться от QWidget, тогда как преобразовать сцену или сам вид в QWidget? Или можно унаследовать основной класс от QGraphicsScene и потом уже интегрировать его в Дизайнер?


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 03, 2011, 23:41
На сцену добавляешь айтемы, а сцену устанавиваешь для вью QGraphicsView (наследник от QWidget) методом void QGraphicsView::setScene ( QGraphicsScene * scene ).


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 04, 2011, 00:44
Сэнкс, не помогло. Походу придется сушить весла, т.к. эта трабла,с отображением виджетов, ставит в ступор. ОНИ ТУПО НЕ ОТОБРАЖАЮТСЯ, как ни крути(


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: alexman от Май 04, 2011, 08:17
Посмотрел бы примеры в папке 'qtdir\examples\graphicsview\'.


Название: Re: keyPressEvent не ловятся клавиши
Отправлено: TranE91 от Май 05, 2011, 04:30
Доброго времени суток. Спасибо за советы всем, проблема решена. Все гениальное просто. Оказывается, при реализации наследника виджета в стд. виджетах, составляющих наследника, нужно было всего-навсего добавить ф-ию ->SHOW();

З.Ы. убил себя об стенку(