为"不需要的QWidget禁用KeyEvent?

时间:2018-01-17 10:56:18

标签: c++ qt user-interface qt-events

我的Mainwindow中有一个QDockWidget,带有QTableWidget和两个QPushbuttons。 当然,我可以用鼠标点击按钮,但我也想点击"点击"他们用左箭头键和右箭头键。

它几乎完美无缺。但是在通过键点击它们之前,似乎焦点跳到QTableWidget的右侧/左侧(其中的项目,它遍历所有列)。

我是否有可能只为QDockWidget中的按钮提供KeyPressEvents?

1 个答案:

答案 0 :(得分:2)

您可以使用event filter这样的内容:

class Filter : public QObject
{
public:
    bool eventFilter(QObject * o, QEvent * e)
    {
        if(e->type() == QEvent::KeyPress)
        {
            QKeyEvent * event = static_cast<QKeyEvent *>(e);
            if((event->key() == Qt::Key_Left) || (event->key() == Qt::Key_Right))
            {
                //do what you want ...
                return true;
            }
        }
        return QObject::eventFilter(o, e);
    }
};

在主窗口类中保留过滤器类的实例:

private:
    Filter filter;

然后将其安装在您的小部件中,例如在主窗口类构造函数中:

//...
installEventFilter(&filter); //in the main window itself
ui->dockWidget->installEventFilter(&filter);
ui->tableWidget->installEventFilter(&filter);
ui->pushButton->installEventFilter(&filter);
//etc ...

您可能需要检查修饰符(例如Ctrl键),以保留箭头键的标准行为:

//...
if(event->modifiers() == Qt::CTRL) //Ctrl key is also pressed
{
        if((event->key() == Qt::Key_Left) || (event->key() == Qt::Key_Right))
        {

//...