Qt 如果所有子部件失去焦点,则发出信号

Qt 如果所有子部件失去焦点,则发出信号,qt,Qt,我有一个QStackedWidget,它有好几页充满了各种QLineEdit和QComboBox子项。每当QStackedWidget不再有任何具有焦点的子对象时,我想发出一个信号(假设一个子对象一开始就具有焦点)。因此,从一个子对象移动到另一个子对象不会发出信号,但一旦在QStackedWidget之外选择了一个小部件,就会发出一个信号。有没有关于如何实施的建议?我已经看过了InstallEventFilter和QSignalMapper,但这两个版本似乎都不适合我的需要。任何建议都将不胜感激

我有一个
QStackedWidget
,它有好几页充满了各种
QLineEdit
QComboBox
子项。每当
QStackedWidget
不再有任何具有焦点的子对象时,我想发出一个信号(假设一个子对象一开始就具有焦点)。因此,从一个子对象移动到另一个子对象不会发出信号,但一旦在
QStackedWidget
之外选择了一个小部件,就会发出一个信号。有没有关于如何实施的建议?我已经看过了
InstallEventFilter
QSignalMapper
,但这两个版本似乎都不适合我的需要。任何建议都将不胜感激。

这有点棘手。即使在从一个孩子到另一个孩子循环时,在一个孩子失去焦点之后和另一个孩子获得焦点之前,也会有一段短暂的时间,因为堆叠小部件的任何孩子都没有焦点。虽然这种状态非常短暂,但这是事实

<> P>我能看到的唯一选择是决定一个小部件失去焦点的时间和没有子小部件的时间,你会考虑到足够长的时间来声明,事实上,没有小部件已经有了焦点。这将是一种类似于用来区分两次鼠标单击和一次双击的机制


这可以通过在注册到每个子级的父级中使用计时器和事件过滤器来实现,该过滤器用于查找焦点输入和输出事件。将计时器设置为某个时间间隔(100 ms?),并在收到焦点输出事件时启动计时器。如果在计时器仍在运行时收到事件中的焦点,请停止计时器。如果计时器完成,您可以触发自己的信号,指示没有子部件具有焦点。

您可以连接到QApplication::focusChanged信号,以便评估相应插槽中的焦点部件。实现这一点的干净方法是从QStackedWidget派生:

class StackedFocusWidget : public QStackedWidget {

    Q_OBJECT

public:

    StackedFocusWidget(QWidget *parent = 0) : QStackedWidget(parent) {
        connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(onFocusChanged(QWidget *, QWidget *)));
    }

private slots:

    void onFocusChanged(QWidget *old, QWidget *now) {
        bool focusOld = old != 0 && isAncestorOf(old);
        bool focusNow = now != 0 && isAncestorOf(now);
        if (!focusOld && focusNow) {
            emit gotFocus();
        } else if (focusOld && !focusNow) {
            emit lostFocus();
        }
    }

signals:

    void gotFocus();
    void lostFocus();
};
每当堆叠小部件或其任何子部件接收到或失去焦点时,将发出StackedFocusWidget::gotFocus和StackedFocusWidget::lostFocus的信号