我希望能够知道QLineEdit
是否是点击。所以我想我应该重新实现以下函数(??):
void QLineEdit::focusInEvent ( QFocusEvent * e ) [virtual protected]
我该怎么做?
另外,请告诉我如何使用focusInEvent()
函数来了解QLineEdit myEdit;
对象是否得到了重点。
编辑:我写了以下函数:
bool LoginDialog::eventFilter(QObject *target, QEvent *event)
{
if (target == m_passwordLineEdit)
{
if (event->type() == QEvent::FocusIn)
{
if(checkCapsLock())
{
QMessageBox::about(this,"Caps Lock", "Your caps lock is ON!");
}
return true;
}
}
return QDialog::eventFilter(target, event);
}
并在m_passwordLineEdit
类构造函数中注册了LoginDialog
,如下所示:
m_passwordLineEdit->installEventFilter(this);
它正陷入MessageBox-es的无限循环中。请帮我解决这个问题。实际上我想用一个弹出窗口(不是QMessageBox
)来实现这个功能。是否可以使用QLabel
来满足这种需求?
答案 0 :(得分:6)
另外,请告诉我如何使用 focusInEvent()函数以便 知道QLineEdit myEdit;对象得到了 对焦。
您应该将自己连接到以下信号:
void QApplication::focusChanged ( QWidget * old, QWidget * now ) [signal]
当新的QWidget是您的QLineEdit时,您知道它得到了关注!
希望它有所帮助!
答案 1 :(得分:4)
类似的东西:
class YourWidget : public QLineEdit
{
Q_OBJECT
protected:
void focusInEvent(QFocusEvent* e);
};
在.cpp
文件中:
void YourWidget::focusInEvent(QFocusEvent* e)
{
if (e->reason() == Qt::MouseFocusReason)
{
// The mouse trigerred the event
}
// You might also call the parent method.
QLineEdit::focusInEvent(e);
}
您可以找到所有可能原因的列表on this page。
答案 2 :(得分:0)
如果您想知道有人点击窗口小部件,您应该覆盖mousePressEvent (QMouseEvent* event)
。除了鼠标点击之外,其他来源都可以触发focusInEvent
。
例如:
class MyLineEdit : public QLineEdit
{
Q_OBJECT
public:
//...
protected:
void mousePressEvent(QMouseEvent* event)
{
//pass the event to QLineEdit
QLineEdit::mousePressEvent(event);
//register the click or act on it
}
};
如果您确实想知道您的小部件何时获得焦点,请使用focusInEvent
当然。