如何在QAbstractScrollArea中接收KeyPress事件

时间:2018-12-29 19:27:51

标签: c++ qt

在源自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();
}

focusPolicy及其QScrollArea上对viewport()和朋友进行的各种试验均无济于事。奇怪的是,QScrollArea::event()处理程序确实收到了键事件。

我想念什么?

1 个答案:

答案 0 :(得分:2)

之所以没有收到关键事件,是因为视口永远都没有焦点,因为QAbstractScrollArea始终将自身设置为视口小部件的焦点代理。因此,行a->viewport()->setFocus()实际上将焦点放在a上。

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