3

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


}
4

1 に答える 1

1

KeyPress イベントを処理するイベント フィルターをクラスに追加します。ここに例があります: http://doc.qt.io/archives/qt-4.7/eventsandfilters.html 追加することを忘れないでください:

installEventFilter(this);

そうしないと機能しません。

于 2012-06-07T08:30:25.750 に答える