在Qt中,当一个小部件获得焦点时,如何获得有关它的通知,以便我可以执行一些自定义代码?是否有信号或事件?
答案 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在更改或编辑文本时发出信号,请参阅文档。