Получить уведомление / событие / сигнал, когда виджет Qt получает фокус
В Qt, когда виджет получает фокус, как можно получить уведомление об этом, чтобы я мог выполнить некоторый пользовательский код? Есть ли сигнал или событие для этого?
8 ответов
Вы можете добавить ан event filter
,
Это пример приложения, написанного с помощью QtCreator. Эта форма имеет QComboBox с именем combobox.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->comboBox->installEventFilter(this);
.
.
.
}
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::FocusOut)
{
if (object == ui->comboBox)
{
qWarning(object->objectName().toLatin1().data());
}
}
return false;
}
При изменении фокуса посылается сигнал "focusChanged", представленный в Qt 4.1.
У него есть два аргумента: он теряет фокус и один получает фокус:
void QApplication::focusChanged(QWidget * old, QWidget * now)
Qt Designer не предназначен для этого уровня программирования WYSIWYG.
Сделайте это в C++:
class LineEdit : public QLineEdit
{
virtual void focusInEvent( QFocusEvent* )
{}
};
Самый простой способ - подключить слот к сигналу QApplication::focusChanged.
На всякий случай, если кто-то ищет два изменения фокуса QMainWindow. Ты можешь использовать
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
Мне бы пришлось поиграть с этим, но просто глядя на документацию QT, есть "focusInEvent". Это обработчик событий.
Вот как вы можете найти информацию о.... Откройте "QT Assistant". Перейти к указателю. Положите в "QLineEdit". На всех страницах виджетов есть действительно полезная ссылка под названием "Список всех членов, включая унаследованных". Этот список великолепен, потому что в нем даже есть унаследованные вещи.
Я сделал быстрый поиск "Фокуса" и нашел все, что связано с фокусом для этого виджета.
Вы столкнулись со странными расколами в QT, если вы посмотрите на документацию focusInEvent
это не слот, это защищенная функция, вы можете переопределить ее, если реализуете подкласс вашего виджета. Если вы хотите поймать событие, поступающее в ваш виджет, вы можете использовать QObject::installEventFilter
это позволяет вам ловить любые события.
По какой-то странной причине разработчики Trolltech решили распространять события пользовательского интерфейса через два пути, сигналы / слоты и QEvent
QWidget::setFocus() - это слот, а не сигнал. Вы можете проверить, находится ли QLineEdit в фокусе с помощью свойства focus. QLineEdit испускает сигналы, когда текст изменяется или редактируется, см. Документацию.