5

BusyIndicator長いプロセスが進行中であることを示したいと思います。問題は、実行しても表示されず、後でプロセスが完了すると表示されることです。ドキュメントによると

ビジー インジケーターは、コンテンツが読み込まれている間、またはリソースが利用可能になるのを待って UI がブロックされている間のアクティビティを示すために使用する必要があります。

元のコードに基づいた最小限のコードを作成しました

Window {
    id: win
    width: 300
    height: 300

    property bool run : false

    Rectangle {
        anchors.fill: parent
        BusyIndicator {
            anchors.centerIn: parent
            running: run
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                run = true
                for(var a=0;a<1000000;a++) { console.log(a) }
                run = false
            }
        }
    }
}

をクリックすると、計算が完了するまでの時間Rectangleを表示したいと思います。BusyIndicator

例として、ここでは for ループを使用しました。実際のシナリオでは、関数 (データベースに約 1000 行を挿入する) をContextProperty. ただし、その場合もBusyIndicatorは表示されません。

私はそれを正しい方法でやっていますか?または、それを行うための最良の方法は何でしょうか?

4

3 に答える 3

6

BusyIndicatorハンドラーでの長時間の操作がonClickedアプリケーション GUI をブロックし、インジケーターが更新されないため、表示できません。GUI のフリーズを避けるために、このような操作は別のスレッドで実行する必要があります。簡単な例:

QML

Window {
    id: win
    width: 300
    height: 300

    property bool run : false

    Rectangle {
        anchors.fill: parent
        BusyIndicator {
            id: busy
            anchors.centerIn: parent
            running: win.run
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                win.run = true
                thread.sendMessage({run : true});
            }
        }

        WorkerScript {
            id: thread
            source: "handler.js"
            onMessage: {
                win.run = messageObject.run;
            }
        }
    }
}

ハンドル.js

WorkerScript.onMessage = function(message) {
    if(message.run === true) {
        for(var a=0;a<1000000;a++) { console.log(a) }
    }
    WorkerScript.sendMessage({run : false});
}
于 2014-12-01T06:12:31.773 に答える
1

今日も同じ問題に遭遇!BusyIndicatorと呼ばれる C++ プロパティから制御していると仮定しますbusy。そして、計算の直前と直後に設定busyしています。これを行うことで解決しました。これは非常にエレガントなソリューションではありませんが、機能します。truefalse

QML

BusyIndicator {
    running: CPPModule.busy
}

CPP

void CPPModule::setBusy(const bool &busy)
{
    m_busy = busy;
    emit busyChanged();
}
void CPPModule::InsertIntoDB()
{
    setBusy(true);
    QThread::msleep(50);
    QCoreApplication::processEvents();
    /*
    very Long Operation
    */
    setBusy(false);
}
于 2015-02-25T08:42:48.430 に答える