1
A
回答
1
如果你想完全避免的價值在更新時,滑塊拖動,就可以使用updateValueWhileDragging
財產Qt Quick的控制1,在Qt Quick的該live
屬性控制2.
在Qt快速控制2,滑塊控件具有valueAt()
函數,可隨時調用該函數來檢查該值。
如果你正在寫的QML自己的滑塊,你可以限制使用Timer
變化信號發射,例如:
property int value
readonly property int actualValue: // some calculation...
Timer {
running: slider.pressed
interval: 200
repeat: true
onTriggered: slider.value = slider.actualValue
}
0
這裏有一個通用的C++ - 端解決方案,與任何QObject
工作:
// https://github.com/KubaO/stackoverflown/tree/master/questions/qml-rate-limter-42284163
#include <QtCore>
class PropertyRateLimiter : public QObject {
Q_OBJECT
qint64 msecsPeriod{500};
const QByteArray property;
bool dirty{};
QVariant value;
QElapsedTimer time;
QBasicTimer timer;
QMetaMethod slot = metaObject()->method(metaObject()->indexOfSlot("onChange()"));
void signal() {
if (time.isValid()) time.restart(); else time.start();
if (dirty)
emit valueChanged(value, parent(), property);
else
timer.stop();
dirty = false;
}
Q_SLOT void onChange() {
dirty = true;
value = parent()->property(property);
auto elapsed = time.isValid() ? time.elapsed() : 0;
if (!time.isValid() || elapsed >= msecsPeriod)
signal();
else
if (!timer.isActive())
timer.start(msecsPeriod - elapsed, this);
}
void timerEvent(QTimerEvent *event) override {
if (timer.timerId() == event->timerId())
signal();
}
public:
PropertyRateLimiter(const char * propertyName, QObject * parent) :
QObject{parent}, property{propertyName}
{
auto mo = parent->metaObject();
auto property = mo->property(mo->indexOfProperty(this->property));
if (!property.hasNotifySignal())
return;
connect(parent, property.notifySignal(), this, slot);
}
void setPeriod(int period) { msecsPeriod = period; }
Q_SIGNAL void valueChanged(const QVariant &, QObject *, const QByteArray & name);
};
#include "main.moc"
和測試線束它:
#include <QtQuick>
const char qmlData[] =
R"__end(
import QtQuick 2.6
import QtQuick.Controls 2.0
ApplicationWindow {
minimumWidth: 300
minimumHeight: 250
visible: true
Column {
anchors.fill: parent
Slider { objectName: "slider" }
Label { objectName: "label" }
}
}
)__end";
int main(int argc, char ** argv) {
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app{argc, argv};
QQmlApplicationEngine engine;
engine.loadData(QByteArray::fromRawData(qmlData, sizeof(qmlData)-1));
auto window = engine.rootObjects().first();
auto slider = window->findChild<QObject*>("slider");
auto label = window->findChild<QObject*>("label");
PropertyRateLimiter limiter("position", slider);
QObject::connect(&limiter, &PropertyRateLimiter::valueChanged, [&](const QVariant & val){
label->setProperty("text", val);
});
return app.exec();
}
相關問題
- 1. 軌道控制器的速率限制
- 2. 速率限制算法限制請求
- 3. 速率限制如何限制API
- 4. Dailymotion API的速率限制
- 5. Twitter的速率限制?
- 6. Twitter的速率限制
- 7. Pinterest的API速率限制
- 8. 環繞速率限制API調用
- 9. Nginx:動態速率限制
- 10. 速率限制註冊API
- 11. java速率限制邏輯
- 12. 超出速率限制
- 13. OkHttp API速率限制
- 14. Soundcloud和api速率限制
- 15. Flask無Redis速率限制
- 16. Twitter API速率限制
- 17. 併發與速率限制
- 18. Ggmap「dsk」速率限制
- 19. 擺動速率限制
- 20. 如何在環回中製作API速率限制政策
- 21. 修改rt.jar的限制
- 22. 速率限制可觀察到的
- 23. Django:簡單的速率限制
- 24. 通過IP的API速率限制
- 25. IBM Cloudant的API速率限制
- 26. 測試appengine的寫入速率限制
- 27. 雅虎yql的速率限制
- 28. node.js:具有時間間隔的貨幣限制並行執行(速率限制)
- 29. 播放WS API:限制請求速率
- 30. Python旋風速率限制AsyncHttpClient獲取
我一無所知QML。在這種情況下:這個解決方案似乎在C++回調中實現了速率限制;在QML上下文中可以這樣做嗎?我試圖避免在用戶快速切換滑塊的情況下經過超時之前的任何類型的函數調用。 – Adrian
在QML中執行它會比較慢,因爲現在您必須在JavaScript引擎中運行相同的代碼。請記住,QML建立在C++之上,它的所有功能都是用C++實現的,所以通過C++與它接口是最快的。另請注意,在Qt中,這些被稱爲插槽,而不是回調。 –