天天看点

Qt 焦点问题

        在写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事件。

        折腾了两天,发现是由于自己的马虎,添加了一个根本没用的控件,导致了这个问题,想想很是懊恼,还要深刻反省自己才是。

继续阅读