Russian Qt Forum
Ноябрь 01, 2024, 22:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: keyPressEvent не ловятся клавиши  (Прочитано 8032 раз)
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;
       }
   }
}
 
ну и естественно, как вы наверное уже догадались, ОНИ НЕ РАБОТАЮТ!!! Даже дебаггер не ловит их.
В чем может быть траБЛЯ?
« Последнее редактирование: Апрель 30, 2011, 18:58 от TranE91 » Записан
alexman
Гость
« Ответ #1 : Апрель 30, 2011, 21:33 »

А фокус ввода установлен во время нажатия клавиш?
Записан
TranE91
Гость
« Ответ #2 : Май 01, 2011, 00:43 »

Эмммм...... хорошо, допустим я установил фокус на этот виджет. Но при добавлении еще одного поля Position на общую форму Track у меня, получается, будут генериться два фокуса одновременно или я ошибаюсь?
Да и еще один вопрос, как переопределить нажатие клапиш во вложенных в этот виджет стд. классов QLineEdit, т.е. чтобы во время добавления своих ноток можно было бы менять размерность клавишами + - ?
Записан
alexman
Гость
« Ответ #3 : Май 01, 2011, 08:53 »

Это кусок твоего кода

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

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

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

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

а ты просто сделал новую функцию котороя никакого отношения к переопределению нажатия клавиш не имеет.
Это вы неправильно сказали!
Записан
alexman
Гость
« Ответ #4 : Май 01, 2011, 09:01 »

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

Да и еще один вопрос, как переопределить нажатие клапиш во вложенных в этот виджет стд. классов QLineEdit, т.е. чтобы во время добавления своих ноток можно было бы менять размерность клавишами + - ?
Опять же можно использовать QObject::installEventFilter ( QObject * filterObj ).
Записан
TranE91
Гость
« Ответ #5 : Май 01, 2011, 18:36 »

Спасибо приогромное. Помогло. Теперь столкнулся с другой проблемой)
Забиндил клавишу P, но когда стоит русская раскладка, то меня посылают в места не столь отдаленные, эта проблема обходима?
Записан
alexman
Гость
« Ответ #6 : Май 01, 2011, 19:59 »

А вам что надо? Чтобы при любой раскладке клавы отрабатвал один и тот же блок?
Записан
TranE91
Гость
« Ответ #7 : Май 01, 2011, 20:26 »

Да, именно оно.
Записан
alexman
Гость
« Ответ #8 : Май 01, 2011, 20:36 »

Возможно это не совсем изящно, но можно смотреть текст евента, QString QKeyEvent::text () const.
Записан
TranE91
Гость
« Ответ #9 : Май 02, 2011, 01:35 »

Сэнкс биг. Тут что, дают ответы на все вопросы?)
Записан
alexman
Гость
« Ответ #10 : Май 02, 2011, 15:20 »

Сэнкс биг. Тут что, дают ответы на все вопросы?)
Ну это же форум Подмигивающий Я так понмаю, что вы дклаете что-то типа редкатора? Тогда лучше использовать каркас QGraphics... Если хотите виджет воткнуть, то есть класс QGraphicsProxyWidget.
Записан
TranE91
Гость
« Ответ #11 : Май 02, 2011, 15:29 »

Хорошо, а при написании Плугина, все отлично прокатит, т.е. мне нужно будет это все в дизайнер добавить еще.
Записан
alexman
Гость
« Ответ #12 : Май 02, 2011, 20:03 »

Зачем плагин? Можно проще через Promote to...
Записан
TranE91
Гость
« Ответ #13 : Май 03, 2011, 03:49 »

Что-то несовсем я понял возможности QGraphicsProxyWidget. Не могли бы пояснить?
Записан
alexman
Гость
« Ответ #14 : Май 03, 2011, 08:31 »

Есть сцена, на сцене есть куча айтемов (можно унаследоваться от QGraphicsItem и рисовать что угодно), а также можно на сцену добавлять обычные виджеты через QGraphicsProxyWidget.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.396 секунд. Запросов: 21.