Прочтите немного о событиях в Qt. Есть раздел о фильтрации событий (но, пожалуйста, не переходите сразу к нему :P).
КРАТКИЙ ОТВЕТ:
void Qwidget::setEnabled ( bool );
Недостатком является то, что он также отключает события мыши, меняет стиль виджета, и это облом.
ДЛИННЫЙ ОТВЕТ: ФИЛЬТР СОБЫТИЙ
Одна из возможностей — фильтровать все события в приложении Qt. Я предполагаю, что функция, которая запускает ваш код Qt, выглядит так (если здесь другой пост):
int main(int argc, char* argv[]){
QApplication app(argc, argv);
QWidget toplevelwidget1;
toplevelwidget1.show()
//stufff
return app.exec();
}
//doesnt have to exactly like this.
вы можете установить фильтр событий для переменной app
. Это более элегантное решение, но оно слишком сложное, потому что оно фильтрует собственные события и потребует некоторой работы...
Вместо этого вы можете отфильтровать только виджеты или окна верхнего уровня (без родителей). Вы определяете фильтр событий (который представляет собой QObject
), например:
class KeyboardFilter: public QObject
{
Q_OBJECT
...
protected:
bool eventFilter(QObject *obj, QEvent *event);
};
bool KeyboardFilter::eventFilter(QObject *obj, QEvent *event)
{
//for all events from keyboard, do nothing
if (event->type() == QEvent::KeyPress ||
event->type() == QEvent::KeyRelease ||
event->type() == QEvent::ShortcutOverride ||
) {
return true;
} else {
// for other, do as usual (standard event processing)
return QObject::eventFilter(obj, event);
}
}
Затем вы устанавливаете фильтр на нужные виджеты, используя:
myDesiredWidgetorObject->installEventFilter(new KeyboardFilter(parent));
Вот и все!
person
UmNyobe
schedule
17.10.2012