Подтвердить что ты не робот

QWidget keyPressEvent override

Я пытаюсь на половину вечности, теперь переопределяя функцию QWidgets keyPressEvent в QT, но это просто не сработает. Я должен сказать, что я новичок в 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 и запустить SIGNAL для каждого события, чтобы уведомить некоторые зарегистрированные объекты.

Мой переопределенный keyPressEvent в QSGameBoard.cpp выглядит следующим образом:

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

Когда я меняю QSGameBoard:: на QWidget:: он принимает события, но я не могу испустить сигнал, потому что компилятор жалуется на область. И если я пишу его так, функция вообще не будет вызвана.

В чем проблема?

4b9b3361

Ответ 1

EDIT: Как указывали другие пользователи, метод, который я изложил изначально, не является правильным способом разрешения этого. Ответа на этот вопрос Vasco Rinaldo

Использование Установите FocusPolicy в Qt:: ClickFocus, чтобы получить keybordfocus мышь klick. 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();
}

Ответ 2

Вам не нужно переопределять mousePressEvent самостоятельно, чтобы вызвать setFocus. Qt планировал это уже.

Установите FocusPolicy на Qt::ClickFocus, чтобы получить keybordfocus кликом мыши.

setFocusPolicy (Qt:: ClickFocus);

Как сказано в руководстве:

Это свойство хранит способ, которым виджет принимает фокус клавиатуры.

Политика Qt:: TabFocus, если виджет принимает фокус клавиатуры с помощью табуляции, Qt:: ClickFocus, если виджет принимает фокус, нажав Qt:: StrongFocus, если он принимает оба, и Qt:: NoFocus (по умолчанию), если он вообще не принимает фокус.

Вы должны включить фокус клавиатуры для виджета, если он обрабатывает события клавиатуры. Обычно это делается из конструктора виджета. Например, конструктор QLineEdit вызывает setFocusPolicy (Qt:: StrongFocus).

Если виджет имеет фокус-прокси, тогда политика фокуса будет распространена на него.

Ответ 3

Установите FocusPolicy в Qt:: ClickFocus, чтобы получить keybordfocus кликом мыши. setFocusPolicy (Qt:: ClickFocus);