在写QT程序时,遇到焦点问题。在某个界面menu中,所有控件的焦点都已设置为NoFocus,按某个按键会弹出一个dialog,关闭dialog后,上下左右按键都不响应,无法进入keyPressEvent,查询发现,这几个按键可以切换焦点,当切换焦点时,则不会写响应keyPress事件,而本界面的控件都已设置为NoFocus,故编写了以下类,检测KeyPress事件,并打印获取焦点的控件。
MyApp::MyApp(int &argc, char **argv, Type index) :
QApplication(argc, argv, index)
{
}
MyApp::MyApp(int &argc, char **argv) :
QApplication(argc, argv)
{
}
bool MyApp::notify(QObject *reciver, QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
// qDebug()<<"key = "<<((QKeyEvent *)e)->key();
QWidget *m_widget = QApplication::focusWidget();
qDebug()<<m_widget->metaObject()->className();
}
return QApplication::notify(reciver, e);
}
在main函数中:
原始: QApplication a(argc, argv);
替换为: MyApp a(argc, argv);
编译执行程序,通过调试发现,当出现上述问题时,打印的焦点所在控件为QPushButton,menu界面虽然有QPushButton,但都设置成了Nofocus,检查发现,在该界面有一个QDialogButtonBox,QDialogButtongBox类是一个包含很多按钮的控件,在对话框中有多个按钮需要分组排列的按钮时,可以使用QDialogButtongBox类。故这个控件即为问题所在,虽然该控件本身设置为NoFocus,但是由于其包含很多QPushButton控件,导致焦点聚焦在某个QPushButton而不响应keyPress事件。
折腾了两天,发现是由于自己的马虎,添加了一个根本没用的控件,导致了这个问题,想想很是懊恼,还要深刻反省自己才是。