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()
是。