Отключить KeyEvent для & quot; ненужного QWidget?

У меня есть QDockWidget в моем главном окне с QTableWidget и двумя кнопками QPush.
Конечно, я могу нажимать кнопки мышью, но я также хочу «щелкать» их левой и правой клавишами со стрелками.

Это почти работает идеально. Но до того, как они нажимаются с помощью клавиши, кажется, что фокус переходит вправо / влево от QTableWidget (элементы в нем проходят через все столбцы).

Возможно ли, что у меня KeyPressEvents только для кнопок в QDockWidget?

1

Решение

Вы можете использовать фильтр событий как это:

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))
{

//...
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]