在源自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()
处理程序确实收到了键事件。
我想念什么?
答案 0 :(得分:2)
之所以没有收到关键事件,是因为视口永远都没有焦点,因为QAbstractScrollArea
始终将自身设置为视口小部件的焦点代理。因此,行a->viewport()->setFocus()
实际上将焦点放在a
上。
要接收关键事件,您需要覆盖QAbstractScrollArea::keyPressEvent
而不是viewportEvent
。