Qt中QAbstractButton::setAutoRepeat設(shè)置按住按鈕自動(dòng)重復(fù)
QAbstractButton::setAutoRepeat 是 Qt 中用于設(shè)置按鈕自動(dòng)重復(fù)功能的接口。當(dāng)啟用自動(dòng)重復(fù)后,用戶(hù)按住按鈕時(shí),按鈕會(huì)周期性地觸發(fā) clicked() 等信號(hào)。
基本用法
#include <QApplication>
#include <QPushButton>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("按住我自動(dòng)重復(fù)");
button.setAutoRepeat(true); // 啟用自動(dòng)重復(fù)
button.setAutoRepeatDelay(500); // 首次重復(fù)前的延遲(毫秒)
button.setAutoRepeatInterval(100); // 重復(fù)間隔(毫秒)
QObject::connect(&button, &QPushButton::clicked, []() {
qDebug() << "按鈕被點(diǎn)擊 at" << QTime::currentTime().toString("hh:mm:ss.zzz");
});
button.show();
return app.exec();
}
詳細(xì)參數(shù)說(shuō)明
1. 核心方法
// 啟用/禁用自動(dòng)重復(fù) void setAutoRepeat(bool enable); // 設(shè)置首次重復(fù)前的延遲(默認(rèn)300ms) void setAutoRepeatDelay(int delay); // 設(shè)置重復(fù)間隔(默認(rèn)100ms) void setAutoRepeatInterval(int interval); // 獲取當(dāng)前設(shè)置 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);
// 設(shè)置自動(dòng)重復(fù)
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后開(kāi)始重復(fù)
button->setAutoRepeatInterval(50); // 每50ms重復(fù)一次
}
private slots:
void increment()
{
count++;
countLabel->setText(QString::number(count));
qDebug() << "增加至:" << count;
}
void decrement()
{
count--;
countLabel->setText(QString::number(count));
qDebug() << "減少至:" << count;
}
};
實(shí)際應(yīng)用場(chǎng)景
1. 音量調(diào)節(jié)按鈕
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);
// 音量減小按鈕:延遲稍長(zhǎng),間隔稍慢
volDown->setAutoRepeat(true);
volDown->setAutoRepeatDelay(500);
volDown->setAutoRepeatInterval(150);
// 音量增大按鈕:同樣的設(shè)置
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);
// 快速響應(yīng):短延遲,快間隔
leftBtn->setAutoRepeat(true);
leftBtn->setAutoRepeatDelay(200);
leftBtn->setAutoRepeatInterval(30);
rightBtn->setAutoRepeat(true);
rightBtn->setAutoRepeatDelay(200);
rightBtn->setAutoRepeatInterval(30);
connect(leftBtn, &QPushButton::pressed, []() {
qDebug() << "向左移動(dòng)開(kāi)始";
});
connect(leftBtn, &QPushButton::released, []() {
qDebug() << "向左移動(dòng)結(jié)束";
});
connect(leftBtn, &QPushButton::clicked, []() {
qDebug() << "向左移動(dòng)一步";
});
connect(rightBtn, &QPushButton::clicked, []() {
qDebug() << "向右移動(dòng)一步";
});
}
};
注意事項(xiàng)
信號(hào)觸發(fā)順序:
- 按下時(shí)觸發(fā)一次
pressed() - 延遲后開(kāi)始周期性觸發(fā)
clicked() - 釋放時(shí)觸發(fā)一次
released()
- 按下時(shí)觸發(fā)一次
性能考慮:
- 間隔時(shí)間不宜過(guò)短,避免過(guò)多信號(hào)導(dǎo)致性能問(wèn)題
- 復(fù)雜的槽函數(shù)需要優(yōu)化處理
用戶(hù)體驗(yàn):
- 根據(jù)場(chǎng)景調(diào)整延遲和間隔時(shí)間
- 快速調(diào)整用短間隔,精確控制用長(zhǎng)間隔
與其他信號(hào)的配合:
// 可以同時(shí)監(jiān)聽(tīng)多個(gè)信號(hào)
connect(button, &QPushButton::pressed, []() {
qDebug() << "按鈕按下";
});
connect(button, &QPushButton::released, []() {
qDebug() << "按鈕釋放";
});
connect(button, &QPushButton::clicked, []() {
qDebug() << "按鈕點(diǎn)擊(自動(dòng)重復(fù)時(shí)多次觸發(fā))";
});
到此這篇關(guān)于Qt中QAbstractButton::setAutoRepeat設(shè)置按住按鈕自動(dòng)重復(fù)的文章就介紹到這了,更多相關(guān)Qt按住按鈕自動(dòng)重復(fù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解
以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
C語(yǔ)言字符函數(shù)中的isalnum()和iscntrl()你都知道嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言字符函數(shù)中的isalnum()和iscntrl(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C++內(nèi)存數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制文件之間的序列化和反序列化方式
這篇文章主要介紹了C++內(nèi)存數(shù)據(jù)結(jié)構(gòu)與二進(jìn)制文件之間的序列化和反序列化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
C++?STL之string的模擬實(shí)現(xiàn)實(shí)例代碼
C++中有命名空間的存在,我們只需把我們的代碼封到自定義的命名空間即可,下面這篇文章主要給大家介紹了關(guān)于C++?STL之string的模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-01-01
詳解C++編程中類(lèi)的成員變量和成員函數(shù)的相關(guān)知識(shí)
這篇文章主要介紹了C++編程中類(lèi)的成員變量和成員函數(shù)的相關(guān)知識(shí),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

