Получить уведомление / событие / сигнал, когда виджет 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 испускает сигналы, когда текст изменяется или редактируется, см. Документацию.

Другие вопросы по тегам