使用过滤器
.cpp
ButtonEventHandler::ButtonEventHandler(QObject *parent)
: QObject{parent}
{
timer = new QTimer(this);
timer -> setSingleShot(true);
timer -> setInterval(3000);
connect(timer, &QTimer::timeout, this, &ButtonEventHandler::handleLongPress);
}
void ButtonEventHandler::handleLongPress() {
emit longPressed();
}
bool ButtonEventHandler::eventFilter(QObject *watched, QEvent *event) {
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() == Qt::LeftButton) {
timer->start();
}
} else if (event->type() == QEvent::MouseButtonRelease) {
if (timer->isActive()) {
timer->stop();
emit clicked();
}
}
return QObject::eventFilter(watched, event);
}
.h
#ifndef BUTTONEVENTHANDLER_H
#define BUTTONEVENTHANDLER_H
#include <QObject>
#include <QTimer>
#include <QMouseEvent>
class ButtonEventHandler : public QObject
{
Q_OBJECT
public:
explicit ButtonEventHandler(QObject *parent = nullptr);
signals:
void clicked();
void longPressed();
private:
QTimer *timer;
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
private slots:
void handleLongPress();
};
#endif // BUTTONEVENTHANDLER_H
然后在主界面的按钮上使用此过滤器即可
ui->pushButton_sleep->installEventFilter(eventHandler);
connect(eventHandler,SIGNAL(clicked()),this,SLOT(sleepclick()));
connect(eventHandler,SIGNAL(longPressed()),this,SLOT(sleeplongPressed()));
在槽函数中写入想要触发的事件