C++ 如何在QAbstractScroll区域接收按键事件

C++ 如何在QAbstractScroll区域接收按键事件,c++,qt,C++,Qt,在从QAbstractScrollArea派生的自定义小部件中,我感觉无法通过QAbstractScrollArea::viewportEvent()处理程序接收任何键盘事件: #include <QtWidgets> struct A: public QScrollArea { bool viewportEvent(QEvent *e) { qDebug() << e; return QScrollArea::viewportE

在从
QAbstractScrollArea
派生的自定义小部件中,我感觉无法通过
QAbstractScrollArea::viewportEvent()处理程序接收任何键盘事件:

#include <QtWidgets>

struct A: public QScrollArea {
    bool viewportEvent(QEvent *e) {
        qDebug() << e;
        return QScrollArea::viewportEvent(e);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    A *a = new A;
    a->viewport()->setFocus();
    a->show();

    return app.exec();
}
#包括
结构A:公共QScrollArea{
bool viewportEvent(QEvent*e){
qDebug()viewport()->setFocus();
a->show();
返回app.exec();
}
qscrolrea
及其
viewport()
上对
focusPolicy
和friends进行的各种实验也没有帮助。奇怪的是,
qscrolrea::event()
处理程序确实接收到关键事件


我遗漏了什么?

您不接收关键事件的原因是视口从来没有焦点,因为
QAbstractScrollArea
总是将自己设置为视口小部件的焦点代理。因此,
a->viewport()->setFocus()
行实际上将焦点赋予
a


为了接收关键事件,您需要覆盖
QAbstractScrollArea::keyPressEvent
,而不是
viewportEvent

,但毕竟为什么?关键事件会丢失在哪里?@Kamajii扩展了答案,解释了为什么视口本身不接收关键事件。哦,这在
QAbstractScr中是有意义的ollArea
透明地为视口提供事件处理程序。它使用专门的事件处理程序(即
QAbstractScrollArea::keyPressEvent
)而不是
qabstractscrollare::viewportEvent
。您的引用建议使用专用事件处理程序,而不是通用的
qabstractScrollare::viewportEvent()
。但是
qabstractScrollare::keypress偶数()
在专用事件处理程序列表中未提及。Corristo的推理如下。不,它不是-该列表并非详尽无遗。建议包括任何专用事件处理程序,其中
QAbstractScrollArea::keyPressEvent()
是。