В Qt, когда виджет получает фокус, как получить уведомление об этом, я могу выполнить какой-то пользовательский код? Есть ли для этого сигнал или событие?
Получить уведомление/событие/сигнал, когда виджет Qt получает фокус
Ответ 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 ;
}