Qt事件过滤器实现空闲检测

class idleDectector : public QObject
{
    Q_OBJECT
public:
    explicit idleDectector(QObject *parent = nullptr);
    ~idleDectector();

signals:
    void idle();

protected:
    bool eventFilter(QObject* obj, QEvent* event) override;
    virtual void timerEvent(QTimerEvent*) override;
private:
    QDateTime lastOperationTime;
    int timerID;
};

  

idleDectector::idleDectector(QObject *parent)
    : QObject{parent}
    , timerID(0)
{
    lastOperationTime = QDateTime::currentDateTime();

    qApp->installEventFilter(this);

    if (Config::GetInstance().getIdleTime() != 0)
    {
        timerID = this->startTimer(1000);
    }
}

idleDectector::~idleDectector()
{
    if (0 != timerID)
    {
        this->killTimer(timerID);
    }
}

void idleDectector::timerEvent(QTimerEvent* event)
{
    if (timerID == event->timerId())
    {
        if ((QDateTime::currentSecsSinceEpoch() - lastOperationTime.toSecsSinceEpoch()) >
            (qint64)Config::GetInstance().getIdleTime() * 60)
        {
            emit idle();
            lastOperationTime = QDateTime::currentDateTime();
        }
    }
}

bool idleDectector::eventFilter(QObject* obj, QEvent* event)
{
    switch (event->type())
    {
    case QEvent::MouseMove:
    case QEvent::KeyPress:
    case QEvent::MouseButtonPress:
        lastOperationTime = QDateTime::currentDateTime();
        break;
    default:
        break;
    }

    return QObject::eventFilter(obj, event);
}

  

应用:

MainWindow连接信号和槽

connect(&mDecector, &idleDectector::idle, this, &MainWindow::onIdle);

来源链接:https://www.cnblogs.com/kuaixue/p/18681270

请登录后发表评论

    没有回复内容