33

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

4

8 回答 8

39

您可以添加 en event filter这是使用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;
}
于 2010-01-02T03:01:04.617 回答
15

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

void QApplication::focusChanged(QWidget * old, QWidget * now)
于 2008-11-26T18:25:05.190 回答
12

Qt Designer isn't designed for this level of WYSIWYG programming.

Do it in C++:

class LineEdit : public QLineEdit
{
    virtual void focusInEvent( QFocusEvent* )
    {}
};
于 2008-11-27T18:36:13.200 回答
6

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

于 2008-12-02T14:43:54.120 回答
2

我不得不玩它,但只要看看 QT 文档,就有一个“focusInEvent”。这是一个事件处理程序。

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

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

于 2008-11-26T18:30:06.600 回答
2

您在 QT 中遇到了奇怪的拆分,如果您查看文档focusInEvent不是插槽,它是受保护的函数,如果您正在实现小部件的子类,则可以覆盖它。如果您只想捕获进入小部件的事件,您可以使用QObject::installEventFilter它来捕获任何类型的事件。

出于某种奇怪的原因,奇趣科技的开发人员决定通过两种途径传播 UI 事件,信号/插槽和QEvent

于 2008-11-28T21:10:51.130 回答
2

以防万一有人在寻找两个 QMainWindow 焦点更改。您可以使用

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

}
于 2016-02-24T11:17:20.977 回答
0

QWidget::setFocus() 是插槽,而不是信号。您可以使用focus 属性检查 QLineEdit 是否处于焦点。QLineEdit 在更改或编辑文本时发出信号,请参阅文档。

于 2008-11-27T01:19:10.923 回答