在 Qt 中,当一个小部件获得焦点时,如何获得有关它的通知,以便我可以执行一些自定义代码?是否有信号或事件?
8 回答
您可以添加 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;
}
当焦点改变时会发送一个“focusChanged”信号,在 Qt 4.1 中引入。
它有两个参数,一个小部件失去焦点,一个获得焦点:
void QApplication::focusChanged(QWidget * old, QWidget * now)
Qt Designer isn't designed for this level of WYSIWYG programming.
Do it in C++:
class LineEdit : public QLineEdit
{
virtual void focusInEvent( QFocusEvent* )
{}
};
最简单的方法是将插槽连接到 QApplication::focusChanged 信号。
我不得不玩它,但只要看看 QT 文档,就有一个“focusInEvent”。这是一个事件处理程序。
以下是您如何查找有关...的信息。打开“QT 助手”。转到索引。放入“QLineEdit”。在所有小部件页面上都有一个非常有用的链接,称为“所有成员列表,包括继承的成员”。这个列表很棒,因为它甚至有继承的东西。
我快速搜索了“Focus”,并找到了与此 Widget 的焦点相关的所有内容。
您在 QT 中遇到了奇怪的拆分,如果您查看文档focusInEvent
不是插槽,它是受保护的函数,如果您正在实现小部件的子类,则可以覆盖它。如果您只想捕获进入小部件的事件,您可以使用QObject::installEventFilter
它来捕获任何类型的事件。
出于某种奇怪的原因,奇趣科技的开发人员决定通过两种途径传播 UI 事件,信号/插槽和QEvent
以防万一有人在寻找两个 QMainWindow 焦点更改。您可以使用
if(e->type() == QEvent::WindowActivate)
{
//qDebug() << "Focus IN " << obj << e ;
}
QWidget::setFocus() 是插槽,而不是信号。您可以使用focus 属性检查 QLineEdit 是否处于焦点。QLineEdit 在更改或编辑文本时发出信号,请参阅文档。