为“不需要的 QWidget?禁用 KeyEvent?
Disable KeyEvent for "unneeded QWidget?
我的主窗口中有一个带有 QTableWidget 和两个 QPushbutton 的 QDockWidget。
当然,我可以用鼠标单击按钮,但我还想 "click" 使用左右箭头键。
它几乎可以完美运行。但是在通过键单击它们之前,焦点似乎跳到了 QTableWidget 的 right/left(其中的项目,它遍历所有列)。
我是否有可能只为 QDockWidget 中的按钮设置 KeyPressEvents?
您可以像这样使用 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);
}
};
在您的主 window 中保留过滤器 class 的实例 class:
private:
Filter filter;
然后将其安装到您的小部件中,例如在你的主要 window class 构造函数中:
//...
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))
{
//...
我的主窗口中有一个带有 QTableWidget 和两个 QPushbutton 的 QDockWidget。 当然,我可以用鼠标单击按钮,但我还想 "click" 使用左右箭头键。
它几乎可以完美运行。但是在通过键单击它们之前,焦点似乎跳到了 QTableWidget 的 right/left(其中的项目,它遍历所有列)。
我是否有可能只为 QDockWidget 中的按钮设置 KeyPressEvents?
您可以像这样使用 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);
}
};
在您的主 window 中保留过滤器 class 的实例 class:
private:
Filter filter;
然后将其安装到您的小部件中,例如在你的主要 window class 构造函数中:
//...
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))
{
//...