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

时间:2008-11-26 18:16:53

标签: qt focus

在Qt中,当一个小部件获得焦点时,如何获得有关它的通知,以便我可以执行一些自定义代码?是否有信号或事件?

8 个答案:

答案 0 :(得分:34)

您可以添加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;
}

答案 1 :(得分:10)

Qt Designer并非专为此级别的WYSIWYG编程而设计。

在C ++中执行:

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

答案 2 :(得分:9)

当焦点发生变化时,会发出一个“focusChanged”信号,在Qt 4.1中引入 它有两个参数,即小部件失去焦点,一个获得焦点:

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

答案 3 :(得分:5)

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

答案 4 :(得分:2)

我必须使用它,但只是查看QT文档,有一个“focusInEvent”。这是一个事件处理程序。

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

我快速搜索了“Focus”,并找到了与此Widget相关的所有内容。

答案 5 :(得分:2)

你已经在QT中看到了奇怪的分裂,如果你看一下文档focusInEvent不是一个插槽它是一个受保护的函数,你可以覆盖它,如果你正在实现你的小部件的子类。如果您只想捕捉进入窗口小部件的事件,可以使用QObject::installEventFilter它让您捕获任何类型的事件。

由于一些奇怪的原因,Trolltech的开发人员决定通过两个途径传播UI事件,信号/插槽和QEvent

答案 6 :(得分:1)

以防任何人寻找两个QMainWindow焦点变化。 你可以使用

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

}

答案 7 :(得分:0)

QWidget :: setFocus()是插槽,而不是信号。您可以检查QLineEdit是否与focus property一致。 QLineEdit在更改或编辑文本时发出信号,请参阅文档。