Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: daimon от Декабрь 22, 2010, 20:41



Название: keyPressEvent проблема
Отправлено: daimon от Декабрь 22, 2010, 20:41
Создал обработку нажатия клавиши для своего виджета - работает нормально, если виджет отображается сам. Если свой виджет повесит на другой виджет - клавиатура не обрабатывается моего виджета. Что делать?


Название: Re: keyPressEvent проблема
Отправлено: alexman от Декабрь 22, 2010, 20:53
В лайоут добавили?


Название: Re: keyPressEvent проблема
Отправлено: daimon от Декабрь 22, 2010, 20:55
В лайоут добавили?
да
хотя виджет, созданный на базе класса из библиотеки qwtplot3d работает при таком расположении нормально и клавиатура обрабатывается


Название: Re: keyPressEvent проблема
Отправлено: shirushizo от Декабрь 22, 2010, 22:17
А фокус при этом на нужном компоненте?


Название: Re: keyPressEvent проблема
Отправлено: alexman от Декабрь 22, 2010, 22:56
Установите Qt::StrongFocus.


Название: Re: keyPressEvent проблема
Отправлено: daimon от Декабрь 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);
   }
}


Название: Re: keyPressEvent проблема
Отправлено: daimon от Декабрь 23, 2010, 00:51
вроде решено в конструкторе графика ввёл
Код:
setFocusPolicy(Qt::FocusPolicy(Qt::StrongFocus));
и заработало. Может правильней бы было переопределить какие-то функции класса QWidget под фокус, чтобы их улавливал лейаут сам?


Название: Re: keyPressEvent проблема
Отправлено: alexman от Декабрь 23, 2010, 09:20
Код:
setFocusPolicy( Qt::StrongFocus );