3

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

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

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

这是作为停靠小部件的地图。(在小部件里面,我可以点击一个机器人,让它变成黄色)https://www.dropbox.com/s/lpo43rl6z4268im/argHRI.png

所以,我的问题是我们如何在使用 Qt 时将键盘输入定向到窗口中的特定小部件。根据我的阅读,这可能与设置焦点政策有关。因此,我尝试在构造函数中将我的dockwidget 的focuspolicy 设置为“StrongFocus”(以便它可以接受键盘输入),但这并没有帮助。

这是我将地图设置为码头小部件的代码,并且我也在尝试设置焦点。

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


}
4

1 回答 1

1

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

installEventFilter(this);

给构造函数,否则它将无法工作。

于 2012-06-07T08:30:25.750 回答