在Qt中,当一个小部件(widget)获得焦点时,如何获取该通知,以便我可以执行一些自定义代码?是否有相应的信号或事件可用?
你可以添加一个 事件过滤器
。
这是使用 QtCreator 编写的应用程序示例。此表单具有名为 combobox 的 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;
}
Qt 4.1引入了一个名为“focusChanged”的信号,用于在焦点更改时发送。它有两个参数,即失去焦点的小部件和获得焦点的小部件:
void QApplication::focusChanged(QWidget * old, QWidget * now)
Qt设计师不适合用于这种所见即所得的编程。
请使用C++完成:
class LineEdit : public QLineEdit
{
virtual void focusInEvent( QFocusEvent* )
{}
};
如果有人正在寻找两个QMainWindow焦点更改的解决方案。您可以使用
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
我需要先尝试一下,但仅凭QT文档,有一个名为“focusInEvent”的事件处理程序。
以下是如何查找有关信息的方法....打开“QT助手”。 转到索引。 输入“QLineEdit”。 在所有小部件页面上都有一个非常有用的链接,称为“包括继承成员在内的所有成员列表”。 这个列表很棒,因为它甚至有继承的东西。
我快速搜索了“Focus”,并找到了与此小部件相关的所有焦点内容。
focusInEvent
不是一个槽函数,而是一个受保护的函数。如果你正在实现小部件的子类,可以重写它。如果你只想捕获进入小部件的事件,你可以使用QObject::installEventFilter
,它可以让你捕获任何类型的事件。QEvent
。QWidget::setFocus() 是一个槽函数,而不是信号。您可以使用focus property检查QLineEdit是否处于焦点状态。当QLineEdit的文本被更改或编辑时,它会发出信号,请参阅文档。