Подтвердить что ты не робот

Получить уведомление/событие/сигнал, когда виджет Qt получает фокус

В Qt, когда виджет получает фокус, как получить уведомление об этом, я могу выполнить какой-то пользовательский код? Есть ли для этого сигнал или событие?

4b9b3361

Ответ 1

Вы можете добавить en 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;
}

Ответ 2

Конструктор Qt не предназначен для этого уровня программирования WYSIWYG.

Сделайте это на С++:

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};

Ответ 3

Сигнал "focusChanged" отправляется при изменении фокуса, представленном в Qt 4.1.
У этого есть два аргумента, он виджет потерял фокус и тот, кто набирает фокус:

void QApplication::focusChanged(QWidget * old, QWidget * now)

Ответ 4

Самый простой способ - подключить слот к сигналу QApplication:: focusChanged.

Ответ 5

Мне нужно будет поиграть с ним, но просто глядя на документацию QT, есть "focusInEvent". Это обработчик событий.

Здесь вы найдете информацию о... Откройте "QT Assistant". Перейдите в Индекс. Вставьте "QLineEdit". Существует действительно полезная ссылка "Список всех членов, включая унаследованные" на всех страницах виджетов. Этот список замечательный, потому что он даже имеет унаследованные вещи.

Я быстро просмотрел "Фокус" и нашел все, что связано с фокусом для этого виджета.

Ответ 6

Вы попали в странные расщепления в QT, если вы посмотрите на документацию focusInEvent, это не слот, это защищенная функция, вы можете переопределить ее, если вы реализуете подкласс вашего виджета. Если вы просто хотите поймать событие, входящее в ваш виджет, вы можете использовать QObject::installEventFilter, чтобы вы могли поймать какие-либо события.

По какой-то нечетной причине разработчики Trolltech решили распространять события пользовательского интерфейса через два канала, сигналы/слоты и QEvent

Ответ 7

QWidget:: setFocus() - это слот, а не сигнал. Вы можете проверить, находится ли QLineEdit в фокусе с свойство focus. QLineEdit испускает сигналы при изменении или редактировании текста, см. Документацию.

Ответ 8

На всякий случай, если кто-то ищет два изменения фокусировки QMainWindow. Вы можете использовать

if(e->type() == QEvent::WindowActivate)
{
    //qDebug() << "Focus IN " << obj << e ;

}