20

QTでQWidgets keyPressEvent関数をオーバーライドして、半永久的にしようとしていますが、うまくいきません。私は CPP は初めてだと言わざるを得ませんが、ObjC と標準 C は知っています。

私の問題は次のようになります。

class QSGameBoard : public QWidget {
Q_OBJECT

public:
  QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s);

signals:
  void keyCaught(QKeyEvent *e);

protected:
  virtual void  keyPressEvent(QKeyEvent *event);
};

QSGameBoard は私の QWidget サブクラスであり、keyPressEvent をオーバーライドし、登録されたオブジェクトに通知するために各イベントでシグナルを発生させる必要があります。

QSGameBoard.cpp のオーバーライドされた keyPressEvent は次のようになります。

void QSGameBoard::keyPressEvent(QKeyEvent *event) {
  printf("\nkey event in board: %i", event->key());
  //emit keyCaught(event);
}

QSGameBoard:: を QWidget:: に変更すると、イベントを受け取りますが、コンパイラがスコープについて不平を言うため、シグナルを送信できません。そして、このように書くと、関数はまったく呼び出されません。

ここで何が問題なのですか?

4

3 に答える 3

14

編集:他のユーザーが指摘したように、私が最初に概説した方法は、これを解決するための適切な方法ではありません。VascoRinaldoによる回答

[FocusPolicyをQt::ClickFocusに設定]を使用して、マウスクリックでkeybordfocusを取得します。setFocusPolicy(Qt :: ClickFocus);

私が与えた以前の(不完全ではありますが)解決策を以下に示します。

ウィジェットが「フォーカス」されていないようです。マウスプレスイベントを上書きします。

void QSGameBoard::mousePressEvent ( QMouseEvent * event ){
    printf("\nMouse in board");
    setFocus();
}

実用的な例のソースコードは次のとおりです。

QSGameBoard.h

#ifndef _QSGAMEBOARD_H
#define _QSGAMEBOARD_H

#include <QWidget>
#include <QGraphicsScene>

class QSGameBoard : public QWidget {
Q_OBJECT

public:
  QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s);

signals:
  void keyCaught(QKeyEvent *e);

protected:
  virtual void  keyPressEvent(QKeyEvent *event);
  void  mousePressEvent ( QMouseEvent * event );
};


#endif  /* _QSGAMEBOARD_H */

QSGameBoard.cpp

#include <QKeyEvent>
#include <QLabel>
#include <QtGui/qgridlayout.h>
#include <QGridLayout>

#include "QSGameBoard.h"


QSGameBoard::QSGameBoard(QWidget* p, int w, int h, QGraphicsScene* s) :
    QWidget(p){

    QLabel* o = new QLabel(tr("Test Test Test"));
    QGridLayout* g  = new QGridLayout(this);
    g->addWidget(o);
}

void QSGameBoard::keyPressEvent(QKeyEvent* event){
    printf("\nkey event in board: %i", event->key());
}

void QSGameBoard::mousePressEvent ( QMouseEvent * event ){
    printf("\nMouse in board");
    setFocus();
}

main.cpp

#include <QtGui/QApplication>
#include <QtGui/qmainwindow.h>

#include "QSGameBoard.h"

int main(int argc, char *argv[]) {
    // initialize resources, if needed
    // Q_INIT_RESOURCE(resfile);

    QApplication app(argc, argv);

    QMainWindow oM;
    QGraphicsScene o;
    QSGameBoard a(&oM, 1, 2, &o);
    oM.setCentralWidget(&a);
    a.show();
    oM.show();

    // create and show your widgets here

    return app.exec();
}
于 2010-04-29T04:10:20.483 に答える
12

setFocusを呼び出すためだけに、 mousePressEventを自分で再実装する必要はありません。Qtはすでにそれを計画しました。

をに設定しFocusPolicyQt::ClickFocus、マウスクリックでkeybordfocusを取得します。

setFocusPolicy(Qt :: ClickFocus);

マニュアルで述べたように:

このプロパティは、ウィジェットがキーボードフォーカスを受け入れる方法を保持します。

ポリシーは、ウィジェットがタブでキーボードフォーカスを受け入れる場合はQt :: TabFocus、ウィジェットがクリックでフォーカスを受け入れる場合はQt :: ClickFocus、両方を受け入れる場合はQt :: StrongFocus、受け入れない場合はQt :: NoFocus(デフォルト)です。フォーカスをすべて受け入れます。

ウィジェットがキーボードイベントを処理する場合は、ウィジェットのキーボードフォーカスを有効にする必要があります。これは通常、ウィジェットのコンストラクターから実行されます。たとえば、QLineEditコンストラクターはsetFocusPolicy(Qt :: StrongFocus)を呼び出します。

ウィジェットにフォーカスプロキシがある場合、フォーカスポリシーがウィジェットに伝達されます。

于 2012-10-17T13:21:24.100 に答える
8

FocusPolicy を Qt::ClickFocus に設定して、マウス クリックでキーボード フォーカスを取得します。setFocusPolicy(Qt::ClickFocus);

于 2012-03-09T09:33:33.157 に答える