当Qt小部件获得焦点时,获取通知/事件/信号

35
在Qt中,当一个小部件(widget)获得焦点时,如何获取该通知,以便我可以执行一些自定义代码?是否有相应的信号或事件可用?
8个回答

41

你可以添加一个 事件过滤器
这是使用 QtCreator 编写的应用程序示例。此表单具有名为 comboboxQComboBox


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;
}

17
Qt 4.1引入了一个名为“focusChanged”的信号,用于在焦点更改时发送。它有两个参数,分别是失去焦点的小部件和获得焦点的小部件。

Qt 4.1引入了一个名为“focusChanged”的信号,用于在焦点更改时发送。它有两个参数,即失去焦点的小部件和获得焦点的小部件:

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

2
参考文献,这是Qt文档中的函数:http://doc.qt.io/qt-5/qapplication.html#focusChanged - Hawkins

13

Qt设计师不适合用于这种所见即所得的编程。

请使用C++完成:

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

什么是所见即所得编程? - AAEM
WYSIWYG:所见即所得。这是MS Word的尝试。例如,LaTex是“WYSIWYM” - 所见即所想 - 生成的PDF与您编写的文本/代码不同。 - KYL3R

7
最简单的方法是将一个槽连接到QApplication::focusChanged信号。

2

如果有人正在寻找两个QMainWindow焦点更改的解决方案。您可以使用

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

}

2

我需要先尝试一下,但仅凭QT文档,有一个名为“focusInEvent”的事件处理程序。

以下是如何查找有关信息的方法....打开“QT助手”。 转到索引。 输入“QLineEdit”。 在所有小部件页面上都有一个非常有用的链接,称为“包括继承成员在内的所有成员列表”。 这个列表很棒,因为它甚至有继承的东西。

我快速搜索了“Focus”,并找到了与此小部件相关的所有焦点内容。


2
你遇到了QT中的一个奇怪分离问题,如果你查看文档,focusInEvent不是一个槽函数,而是一个受保护的函数。如果你正在实现小部件的子类,可以重写它。如果你只想捕获进入小部件的事件,你可以使用QObject::installEventFilter,它可以让你捕获任何类型的事件。
由于某种奇怪的原因,Trolltech的开发人员决定通过两个途径传播UI事件,即信号/槽和QEvent

1
您可以覆盖虚基函数。这就是为什么事件是虚函数的原因。当继承对该功能不太有用时,Trolltech使用信号代替。 - mxcl
事件和信号/插槽是非常不同的。例如,接收器接收事件的顺序是明确定义的,并且一旦处理完事件,处理过程就会停止。 - Frank Osterfeld

0

QWidget::setFocus() 是一个槽函数,而不是信号。您可以使用focus property检查QLineEdit是否处于焦点状态。当QLineEdit的文本被更改或编辑时,它会发出信号,请参阅文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接