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. 控制帧速率或限制AVCaptureVideoPreviewLayer
- 3. 速率限制如何限制API
- 4. 速率限制算法限制请求
- 5. Twitter的速率限制
- 6. Pinterest的API速率限制
- 7. Twitter的速率限制?
- 8. Dailymotion API的速率限制
- 9. RxSwift的速率限制
- 10. Twitter的API速率限制
- 11. Twitter的速率限制json
- 12. 环绕速率限制API调用
- 13. 修改限制
- 14. Node.js的API率多速率限制
- 15. 分布式速率限制
- 16. OkHttp API速率限制
- 17. Ggmap“dsk”速率限制
- 18. Twitter随机速率限制
- 19. 速率限制GET请求
- 20. Nginx:动态速率限制
- 21. Twitter API速率限制
- 22. 超出速率限制
- 23. SurveyMonkey API速率限制
- 24. 了解iptables速率限制
- 25. Twitter速率限制问题
- 26. 摆动速率限制
- 27. Spotify Web API速率限制
- 28. Instgram API速率限制
- 29. java速率限制逻辑
- 30. 并发与速率限制
我一无所知QML。在这种情况下:这个解决方案似乎在C++回调中实现了速率限制;在QML上下文中可以这样做吗?我试图避免在用户快速切换滑块的情况下经过超时之前的任何类型的函数调用。 – Adrian
在QML中执行它会比较慢,因为现在您必须在JavaScript引擎中运行相同的代码。请记住,QML建立在C++之上,它的所有功能都是用C++实现的,所以通过C++与它接口是最快的。另请注意,在Qt中,这些被称为插槽,而不是回调。 –