Получить уведомление / событие / сигнал, когда виджет Qt получает фокус - PullRequest
23 голосов
/ 26 ноября 2008

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

Ответы [ 8 ]

34 голосов
/ 02 января 2010

Вы можете добавить en event filter.
Это пример приложения, написанного с помощью QtCreator . Эта форма имеет QComboBox с именем выпадающий список .


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;
}
10 голосов
/ 27 ноября 2008

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

Сделайте это в C ++:

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};
9 голосов
/ 26 ноября 2008

При изменении фокуса посылается сигнал «focusChanged», представленный в Qt 4.1. У него есть два аргумента: он теряет фокус и один получает фокус:

void QApplication::focusChanged(QWidget * old, QWidget * now)
5 голосов
/ 02 декабря 2008

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

2 голосов
/ 29 ноября 2008

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

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

2 голосов
/ 26 ноября 2008

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

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

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

1 голос
/ 24 февраля 2016

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

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

}
0 голосов
/ 27 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...