使用Qt时将键盘输入定向到窗口小部件

时间:2012-06-07 00:16:36

标签: qt opengl widget keyboard-events

我正在使用Qt创建GUI。基本上它是一个交互式地图,显示机器人在竞技场中实时移动,并允许用户通过使用鼠标和键盘键与机器人交互(告诉他们去/停止)。我使用opengl来创建地图本身,一切都很完美,我可以看到机器人在地图上移动,我可以按下键盘上的不同键并发送实际的机器人命令。

现在,我需要使用这个地图并使它成为一个更大的GUI的一部分,它将该地图与其他对象一起保存,并非所有对象都必须使用opengl。因此,通过使用Qt创建者(设计者),我在GUI中有一些拖放标签,我还在GUI中添加了“dockwidget”。 dockwidget在其中保存了我之前创建的交互式地图。现在,我无法再使用键盘向我的地图发送命令。我仍然可以点击我地图上的不同机器人,我可以看到它们被选中并更改了颜色(正如我编写的那样)但是按键没有相应的动作(因为它已被编码)。

这就是地图本身的样子。 http://dl.dropbox.com/u/46437808/collision3.png

这是作为停靠小部件的地图。 (在widge内部,我能够点击一个机器人并使其变为黄色)https://www.dropbox.com/s/lpo43rl6z4268im/argHRI.png

所以,我的问题是我们如何在使用Qt时将键盘输入定向到窗口中的特定小部件。从我读到的内容可能与设定焦点政策有关。所以,我试着将我的dockwidget的focuspolicy设置为“StrongFocus”(这样它可以接受键盘输入),但这没有帮助。

以下是我将地图设置为dockwidget的代码,我也试图设置焦点。

    #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);


}

1 个答案:

答案 0 :(得分:1)

添加一个处理KeyPress事件的事件过滤器。这里有一些例子:http://doc.qt.io/archives/qt-4.7/eventsandfilters.html 只是不要忘记添加:

installEventFilter(this);

到构造函数,否则将无效。