在Qt C++中,可以通过重写QWidget派生类的keyPressEventkeyReleaseEvent函数来实现长按触发函数,并与单次触发函数区分。

首先,在头文件中声明一个QTimer对象和一个布尔变量来控制长按触发函数的执行:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();

protected:
    void keyPressEvent(QKeyEvent *event) override;
    void keyReleaseEvent(QKeyEvent *event) override;

private slots:
    void longPressTriggered();
    void singlePressTriggered();

private:
    QTimer *longPressTimer;
    bool isLongPress;
};

在实现文件中,初始化longPressTimerisLongPress变量,并连接longPressTimertimeout信号到长按触发函数的槽函数:

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    longPressTimer = new QTimer(this);
    longPressTimer->setInterval(1000); // 设置长按时间为1秒
    connect(longPressTimer, &QTimer::timeout, this, &MyWidget::longPressTriggered);

    isLongPress = false;
}

MyWidget::~MyWidget()
{
    delete longPressTimer;
}

重写keyPressEvent函数,当按下键盘时,启动longPressTimer并设置isLongPresstrue

void MyWidget::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Space) {
        longPressTimer->start();
        isLongPress = true;
    }
}

重写keyReleaseEvent函数,当释放键盘时,判断isLongPress的值,如果为true,则停止longPressTimer并执行长按触发函数;如果为false,则执行单次触发函数:

void MyWidget::keyReleaseEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Space) {
        if (isLongPress) {
            longPressTimer->stop();
            isLongPress = false;
        } else {
            singlePressTriggered();
        }
    }
}

实现长按触发函数和单次触发函数的槽函数:

void MyWidget::longPressTriggered()
{
    qDebug() << "Long press triggered";
}

void MyWidget::singlePressTriggered()
{
    qDebug() << "Single press triggered";
}

以上就是一个简单的实现长按触发函数且与单次触发函数区分的例子。你可以根据具体需求修改长按时间和触发函数的实现逻辑

qt c++ 实现长按触发函数 且与单次区分

原文地址: http://www.cveoy.top/t/topic/hC4D 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录