单击按钮时运行BusyIndi​​cator(信号到C ++)

时间:2016-06-15 07:56:58

标签: qt qml

我创建了一个具有ListView和两个按钮的界面。单击扫描按钮时,它将调用C ++并更改ListView的模型。之后C ++将发出信号通知模型被更改,因此QML中的ListView将更新为新模型。我想让BusyIndi​​cator在这个过程中运行。我怎样才能做到这一点 ?。

我在stackoverflow上看到了一些像这样的解决方案:BusyIndicator does not show up但是没有一个解决方案适用于我的情况。

任何人都可以帮助我吗?感谢。

这是我的qml代码:

import QtQuick 2.5
import QtQuick.Layouts 1.3
import Qt.labs.controls 1.0

Rectangle
{
    objectName: "bluetoothPage"
    anchors.fill: parent

    property var bluetoothDataModel: messageFromApp.bluetoothData
    onBluetoothDataModelChanged: listView.update()

    signal qmlScanButtonSignal()
    signal qmlDisconnectButtonSignal()

    ColumnLayout
    {
        anchors.fill: parent
        spacing: 6

        RowLayout
        {
            Layout.fillWidth: true

            Text
            {
                Layout.fillWidth: true
                text: "Connect with ECU"
                font.bold: true
                font.pixelSize: 20
            }

            BusyIndicator
            {
                id: busyIndicator
                Layout.preferredWidth: 30
                Layout.preferredHeight: 30
                running: false
                visible: false
            }
        }

        GroupBox
        {
            Layout.fillHeight: true
            Layout.fillWidth: true
            title: qsTr("Available device:")

            ListView
            {
                id: listView
                anchors.fill: parent
                model: bluetoothDataModel
                delegate: Component
                          {
                              Item
                              {
                                    width: parent.width
                                    height: 40
                                    Column
                                    {
                                        Text { text: "Name:" + model.modelData.name }
                                        Text { text: "Number:" + model.modelData.macAddress }
                                    }
                                    MouseArea
                                    {
                                        anchors.fill: parent
                                        onClicked: listView.currentIndex = index
                                    }
                               }
                           }
                highlight: Rectangle
                           {
                                color: "blue"
                           }
            }
        }

        RowLayout
        {
            Layout.fillWidth: true
            Layout.preferredHeight: 10

            Button
            {
                Layout.fillHeight: true
                Layout.fillWidth: true
                text: "Scan"
                onClicked: qmlScanButtonSignal()
            }

            Button
            {
                Layout.fillHeight: true
                Layout.fillWidth: true
                text: "Disconnect"
                onClicked: qmlDisconnectButtonSignal()
            }
        }
    }

}

1 个答案:

答案 0 :(得分:1)

在我的情况下,只有这个解决方案适合我。但是,就像每个人都说使用QCoreApplication::processEvents()  真的是不好的做法。我也尝试使用QThread,但在线程内发出信号时会崩溃。如果您有任何进一步的解决方案,请现在就让我。我真的很感激。感谢。

<强> 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);
}

另一种解决方案是:

Timer {
   id: myTimer
   interval: 1
   onTriggered: {
        app.someLongRunningFunction();
        myActivityIndicator.visible = false;
   }
}

Butoon{
    ....
    onClicked: {
        myActivityIndicator.visible=true;
        myTimer.start();
    }
}