example - Dirigir la entrada del teclado a un widget cuando se usa Qt
qpushbutton qt (1)
Estoy creando una GUI usando Qt. Básicamente es un mapa interactivo que muestra robots que se mueven en un estadio en tiempo real y permite al usuario interactuar con los robots (decirles que vayan / paran) usando las teclas del mouse y el teclado. Usé OpenGL para crear el mapa y todo funciona a la perfección, puedo ver a los robots moviéndose en el mapa y puedo presionar diferentes teclas en el teclado y enviar los comandos reales de los robots.
Ahora, necesito tomar este mapa y hacer que se convierta en una parte de una GUI más grande que contiene este mapa junto con otros objetos, no todos los objetos necesariamente usan opengl. Entonces, al usar el creador de Qt (diseñador) tengo algunas pestañas arrastradas / sueltas en mi GUI y también he agregado un "dockwidget" en mi GUI. El dockwidget contiene el mapa interactivo que había creado antes. Ahora, sin embargo, ya no puedo enviar comandos usando mi teclado a mi mapa. Todavía puedo hacer clic en robots diferentes en mi mapa y puedo ver que se seleccionan y cambian los colores (como lo codifiqué) pero presionar las teclas no tienen acciones correspondientes (como se ha codificado).
Este es el aspecto del mapa en sí mismo. http://dl.dropbox.com/u/46437808/collision3.png
Este es el mapa como un widget acoplado. (Dentro del widgete, pude hacer clic en un robot y hacer que se volviera amarillo) https://www.dropbox.com/s/lpo43rl6z4268im/argHRI.png
Entonces, mi pregunta es cómo dirigimos la entrada del teclado a un widget específico en una ventana cuando usamos Qt. Por lo que leí, podría tener que ver con establecer políticas de enfoque. Entonces, traté de establecer la política de enfoque de mi dockwidget en "StrongFocus" (para que pueda tomar la entrada del teclado) en el constructor, pero eso no ayudó.
Aquí está el código en el cual estoy configurando mi mapa como el dockwidget y estoy tratando de establecer el foco también.
#include "ui_arghri.h"
argHRI::argHRI(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::argHRI)
{
ui->setupUi(this);
ui->dockMap->activateWindow();
//ui->dockMap->keyboardGrabber();
//ui->dockMap->grabKeyboard();
ui->dockMap->setFocus();
ui->dockMap->setFocusPolicy(Qt::StrongFocus);
}
argHRI::~argHRI()
{
delete ui;
}
void argHRI::addMap(Map * map)
{
qDebug()<<"argHRI::in AddMap test is "<<map->test;
//ui->dockMap->show();
ui->dockMap->setWidget(map);
}
Agregue un filtro de eventos que maneje los eventos de KeyPress a su clase. Aquí hay ejemplos: http://doc.qt.io/archives/qt-4.7/eventsandfilters.html Solo no olvide agregar:
installEventFilter(this);
al constructor o no funcionará de otra manera.