C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt按住按钮自动重复

Qt中QAbstractButton::setAutoRepeat设置按住按钮自动重复

作者:晴雨日记

QAbstractButton::setAutoRepeat接口用于设置按钮自动重复功能,本文就来介绍一下Qt中QAbstractButton::setAutoRepeat设置按住按钮自动重复,感兴趣的可以了解一下

QAbstractButton::setAutoRepeat 是 Qt 中用于设置按钮自动重复功能的接口。当启用自动重复后,用户按住按钮时,按钮会周期性地触发 clicked() 等信号。

基本用法

#include <QApplication>
#include <QPushButton>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    QPushButton button("按住我自动重复");
    button.setAutoRepeat(true); // 启用自动重复
    button.setAutoRepeatDelay(500); // 首次重复前的延迟(毫秒)
    button.setAutoRepeatInterval(100); // 重复间隔(毫秒)
    
    QObject::connect(&button, &QPushButton::clicked, []() {
        qDebug() << "按钮被点击 at" << QTime::currentTime().toString("hh:mm:ss.zzz");
    });
    
    button.show();
    return app.exec();
}

详细参数说明

1. 核心方法

// 启用/禁用自动重复
void setAutoRepeat(bool enable);

// 设置首次重复前的延迟(默认300ms)
void setAutoRepeatDelay(int delay);

// 设置重复间隔(默认100ms)
void setAutoRepeatInterval(int interval);

// 获取当前设置
bool autoRepeat() const;
int autoRepeatDelay() const;
int autoRepeatInterval() const;

2. 完整示例

class CounterWidget : public QWidget
{
    Q_OBJECT
private:
    QPushButton *incButton;
    QPushButton *decButton;
    QLabel *countLabel;
    int count = 0;

public:
    CounterWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        QVBoxLayout *layout = new QVBoxLayout(this);
        
        countLabel = new QLabel("0", this);
        countLabel->setAlignment(Qt::AlignCenter);
        countLabel->setStyleSheet("font-size: 24px;");
        
        incButton = new QPushButton("+", this);
        decButton = new QPushButton("-", this);
        
        // 设置自动重复
        setupAutoRepeat(incButton);
        setupAutoRepeat(decButton);
        
        layout->addWidget(countLabel);
        layout->addWidget(incButton);
        layout->addWidget(decButton);
        
        connect(incButton, &QPushButton::clicked, this, &CounterWidget::increment);
        connect(decButton, &QPushButton::clicked, this, &CounterWidget::decrement);
    }

private:
    void setupAutoRepeat(QPushButton *button)
    {
        button->setAutoRepeat(true);
        button->setAutoRepeatDelay(400); // 按住400ms后开始重复
        button->setAutoRepeatInterval(50); // 每50ms重复一次
    }
    
private slots:
    void increment()
    {
        count++;
        countLabel->setText(QString::number(count));
        qDebug() << "增加至:" << count;
    }
    
    void decrement()
    {
        count--;
        countLabel->setText(QString::number(count));
        qDebug() << "减少至:" << count;
    }
};

实际应用场景

1. 音量调节按钮

class VolumeControl : public QWidget
{
    Q_OBJECT
public:
    VolumeControl(QWidget *parent = nullptr)
    {
        QHBoxLayout *layout = new QHBoxLayout(this);
        
        QPushButton *volDown = new QPushButton("🔉", this);
        QPushButton *volUp = new QPushButton("🔊", this);
        
        // 音量减小按钮:延迟稍长,间隔稍慢
        volDown->setAutoRepeat(true);
        volDown->setAutoRepeatDelay(500);
        volDown->setAutoRepeatInterval(150);
        
        // 音量增大按钮:同样的设置
        volUp->setAutoRepeat(true);
        volUp->setAutoRepeatDelay(500);
        volUp->setAutoRepeatInterval(150);
        
        layout->addWidget(volDown);
        layout->addWidget(volUp);
        
        connect(volDown, &QPushButton::clicked, this, &VolumeControl::decreaseVolume);
        connect(volUp, &QPushButton::clicked, this, &VolumeControl::increaseVolume);
    }

private slots:
    void decreaseVolume() {
        // 减小音量逻辑
        qDebug() << "音量减小";
    }
    
    void increaseVolume() {
        // 增大音量逻辑
        qDebug() << "音量增大";
    }
};

2. 游戏控制

class GameController : public QWidget
{
    Q_OBJECT
public:
    GameController(QWidget *parent = nullptr)
    {
        // 方向控制按钮
        QPushButton *leftBtn = new QPushButton("←", this);
        QPushButton *rightBtn = new QPushButton("→", this);
        
        // 快速响应:短延迟,快间隔
        leftBtn->setAutoRepeat(true);
        leftBtn->setAutoRepeatDelay(200);
        leftBtn->setAutoRepeatInterval(30);
        
        rightBtn->setAutoRepeat(true);
        rightBtn->setAutoRepeatDelay(200);
        rightBtn->setAutoRepeatInterval(30);
        
        connect(leftBtn, &QPushButton::pressed, []() {
            qDebug() << "向左移动开始";
        });
        connect(leftBtn, &QPushButton::released, []() {
            qDebug() << "向左移动结束";
        });
        connect(leftBtn, &QPushButton::clicked, []() {
            qDebug() << "向左移动一步";
        });
        
        connect(rightBtn, &QPushButton::clicked, []() {
            qDebug() << "向右移动一步";
        });
    }
};

注意事项

  1. 信号触发顺序

    • 按下时触发一次 pressed()
    • 延迟后开始周期性触发 clicked()
    • 释放时触发一次 released()
  2. 性能考虑

    • 间隔时间不宜过短,避免过多信号导致性能问题
    • 复杂的槽函数需要优化处理
  3. 用户体验

    • 根据场景调整延迟和间隔时间
    • 快速调整用短间隔,精确控制用长间隔
  4. 与其他信号的配合

// 可以同时监听多个信号
connect(button, &QPushButton::pressed, []() {
    qDebug() << "按钮按下";
});

connect(button, &QPushButton::released, []() {
    qDebug() << "按钮释放";
});

connect(button, &QPushButton::clicked, []() {
    qDebug() << "按钮点击(自动重复时多次触发)";
});

到此这篇关于Qt中QAbstractButton::setAutoRepeat设置按住按钮自动重复的文章就介绍到这了,更多相关Qt按住按钮自动重复内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文