私はQt5.7/QMLアプリケーションを設計しています。主な考え方は、ボタンを押すとシェルコマンドが起動し、時間がかかります。このコマンドの結果はウィジェットに反映する必要があります。
その間、何かがバックグラウンドで起こっていることをユーザーに示すために、実行するにはSequentialAnimationが必要です。だから私はアニメーションを開始し、シェルコマンドを送信するプロセスを呼び出します。
しかし、シェルコマンドが戻るまでアニメーションはGUI全体としてフリーズしているようです。
提案がありますか?
QMLコード:SequentialAnimationをバックグラウンドで実行するには?
CircularGauge {
id: speedometer_wr
x: 199
y: 158
value: valueSource.bps
maximumValue: 400
width: height
height: container.height * 0.5
stepSize: 0
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: 46
}
style: DashboardGaugeStyle {}
NumberAnimation {
id: animation_wr
running: false
target: speedometer_wr
property: "value"
easing.type: Easing.InOutSine
from: 0
to: 300
duration: 15000
}
}
Button {
id: button_benchmark
x: 168
y: 26
width: 114
height: 47
text: qsTr("Benchmark")
tooltip: "Execute the performance test"
checkable: true
function handle_becnhmark() {
speedometer_wr.value = 0;
// Uncheck the button
button_benchmark.checked = false;
// Start the animation
animation_wr.start();
// Run the benchmark
var res = backend.run_benchmark();
// Stop the animation
animation_wr.stop();
speedometer_wr.value = parseFloat(res.split(",")[0]);
}
onClicked: {handle_becnhmark()}
}
CPPコード:
#include <QProcess>
#include <QtDebug>
#include "backend.h"
#include <QRegExp>
BackEnd::BackEnd(QObject *parent) : QObject(parent)
{
}
QString BackEnd::run_benchmark() {
qDebug() << "in run_benchmark";
QProcess proc;
// Execute shell command
proc.start(<LONG_SHELL_COMMAND>);
if (!proc.waitForStarted())
return "";
if (!proc.waitForFinished())
return "";
// Get the results, parse and return values
QString result(proc.readAll());
return result;
}
[MCVE]を提供してください。シェルコマンド実行中にイベントを処理するのを忘れているかのように聞こえます。 –