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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: keyPressEvent проблема  (Прочитано 3080 раз)
daimon
Гость
« : Декабрь 22, 2010, 20:41 »

Создал обработку нажатия клавиши для своего виджета - работает нормально, если виджет отображается сам. Если свой виджет повесит на другой виджет - клавиатура не обрабатывается моего виджета. Что делать?
Записан
alexman
Гость
« Ответ #1 : Декабрь 22, 2010, 20:53 »

В лайоут добавили?
Записан
daimon
Гость
« Ответ #2 : Декабрь 22, 2010, 20:55 »

В лайоут добавили?
да
хотя виджет, созданный на базе класса из библиотеки qwtplot3d работает при таком расположении нормально и клавиатура обрабатывается
« Последнее редактирование: Декабрь 22, 2010, 20:57 от daimon » Записан
shirushizo
Гость
« Ответ #3 : Декабрь 22, 2010, 22:17 »

А фокус при этом на нужном компоненте?
Записан
alexman
Гость
« Ответ #4 : Декабрь 22, 2010, 22:56 »

Установите Qt::StrongFocus.
Записан
daimon
Гость
« Ответ #5 : Декабрь 22, 2010, 23:34 »

Установите Qt::StrongFocus.
окно активно, на нём кроме моего графика виджета нет- значит в фокусе
Ещё дополнение - окно с виджетом графика находится в MdiArea и почему-то при активном окне графика клавиши влево-вправо реагируют не на графике, а на области Mdi - заметно, когда окна больше области Mdi и клавишами влево-вправо идёт перемещение по скролу области

Код
C++ (Qt)
if(e == PLOT2D)
{
graph = new Plotter();
 
graph->set_plot_settings(Settings2DGraph(QVector<Curve>()<<Curve(QVector<tabl>()<<tabl(1,2)<<tabl(4,sequenceNumber))));
graph->setFocus(Qt::FocusReason(Qt::StrongFocus));
 
box.addWidget(graph);
setLayout(&box);
}
if(e == PLOT3D)
{
graph3d = new Plot_surface(this);
graph3d->setAttribute(Qt::WA_OpaquePaintEvent);
//graph3d->loadFromData()
box.addWidget(graph3d);
 
//graph3d->show();
setLayout(&box);
}
просто идёт проверка при добавление виджета на окно, второй виджет - обрабатывает клавиатуру, а первый - не хочет, хотя всё там прописано

Код
C++ (Qt)
void Plotter::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
 
 
   case Qt::Key_Left:
opt_graph.move_left_right_coordinates_x(1,1);
       break;
   case Qt::Key_Right:
opt_graph.move_left_right_coordinates_x(0,1);
       break;
   case Qt::Key_Down:
        opt_graph.move_top_bottom_coordinates_y(0,1);
       break;
   case Qt::Key_Up:
       opt_graph.move_top_bottom_coordinates_y(1,1);
       break;
 
case Qt::Key_Minus:
if(event->modifiers()&Qt::ShiftModifier)
opt_graph.zoom_x(0,1);
else if(event->modifiers()&Qt::ControlModifier)
opt_graph.zoom_y(0,1);
else opt_graph.zoom_x_y(0,1);
       break;
 
case Qt::Key_Plus:
if(event->modifiers()&Qt::ShiftModifier)
opt_graph.zoom_x(1,1);
else if(event->modifiers()&Qt::ControlModifier)
opt_graph.zoom_y(1,1);
else opt_graph.zoom_x_y(1,1);
       break;
 
 
   default:
       QWidget::keyPressEvent(event);
   }
}
« Последнее редактирование: Декабрь 22, 2010, 23:47 от daimon » Записан
daimon
Гость
« Ответ #6 : Декабрь 23, 2010, 00:51 »

вроде решено в конструкторе графика ввёл
Код:
setFocusPolicy(Qt::FocusPolicy(Qt::StrongFocus));
и заработало. Может правильней бы было переопределить какие-то функции класса QWidget под фокус, чтобы их улавливал лейаут сам?
Записан
alexman
Гость
« Ответ #7 : Декабрь 23, 2010, 09:20 »

Код:
setFocusPolicy( Qt::StrongFocus );
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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