QWidget keyPressEvent переопределить - PullRequest
20 голосов
/ 29 апреля 2010

Я пытаюсь на пол-вечности переопределить функцию 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 и запускать СИГНАЛ для каждого события, чтобы уведомить некоторые зарегистрированные объекты.

Мой переопределенный keyPressEvent в QSGameBoard.cpp выглядит так:

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

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

В чем здесь проблема?

Ответы [ 3 ]

15 голосов
/ 29 апреля 2010

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

Используйте Установите FocusPolicy на Qt :: ClickFocus, чтобы получить фокус клавиатуры щелчок мышью. 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();
}
12 голосов
/ 17 октября 2012

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

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

setFocusPolicy (Qt :: ClickFocus);

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

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

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

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

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

8 голосов
/ 09 марта 2012

Установите для FocusPolicy значение Qt :: ClickFocus, чтобы получить фокус клавиатуры с помощью щелчка мыши. setFocusPolicy (Qt :: ClickFocus);

...