Переопределение QWidget keyPressEvent

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

Какова проблема здесь?

19
задан KTC 21 May 2010 в 18:38
поделиться

1 ответ

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

Использование Установите 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();
}
14
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: