Qtを使用してGUIを作成しています。基本的には、リアルタイムでアリーナ内を移動するロボットを表示し、ユーザーがマウスとキーボードのキーを使用してロボットと対話 (移動/停止を指示) できるインタラクティブ マップです。私は opengl を使用してマップ自体を作成しましたが、すべてが完全に機能しており、ロボットがマップ上を移動しているのを確認でき、キーボードのさまざまなキーを押して実際のロボット コマンドを送信できます。
ここで、このマップを他のオブジェクトと一緒に保持する大きな GUI の一部にする必要があります。すべてのオブジェクトが必ずしも opengl を使用しているわけではありません。そのため、Qt クリエーター (デザイナー) を使用することで、GUI にドラッグ/ドロップされたタブがいくつかあり、GUI に「dockwidget」も追加しました。ドックウィジェットには、以前に作成したインタラクティブ マップが保持されています。ただし、キーボードを使用してマップにコマンドを送信できなくなりました。マップ上のさまざまなロボットをクリックすることはできますが、それらが選択されて色が変わることはわかりますが (コード化されているように)、キーを押しても対応するアクションはありません (コード化されているため)。
これは、マップ自体がどのように見えるかです。http://dl.dropbox.com/u/46437808/collision3.png
これは、ドッキングされたウィジェットとしてのマップです。(ウィジェット内で、1 つのロボットをクリックして黄色に変えることができました) https://www.dropbox.com/s/lpo43rl6z4268im/argHRI.png
それで、私の質問は、Qt を使用しているときにウィンドウ内の特定のウィジェットにキーボード入力をどのように送信するかです。私が読んだことから、フォーカスポリシーの設定に関係している可能性があります。そのため、コンストラクターでドックウィジェットのフォーカスポリシーを「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);
}