Передача QList от C ++ до QML - PullRequest
       20

Передача QList от C ++ до QML

0 голосов
/ 14 апреля 2020

Добрый вечер,

Мы программируем плату DaVinci DM8168 с помощью Qt5.7.1 и QtQuick2.7

, мы хотели бы передать список типа: QList из C ++ в QML, чтобы иметь возможность рисовать его асинхронно и, прежде всего, эффективно. Список изменен потоком на C ++. Мы не можем указать частоту обновления этого списка вообще: это может быть только один раз в секунду или десятки! Это зависит от целевой среды.

Наше решение (частично работающее) следующее:

На стороне C ++ мы используем QPROPERTIES:

фрагмент нашего кода:

MyClass.h
class MyClass: public Observer
{
        Q_OBJECT
        Q_PROPERTY(QList<QObject*> getFailuresHistory READ getFailuresHistory NOTIFY       failuresHistoryListChanged)

QList<QObject*>getFailuresHistory(){return failuresHistory_;}
signals:
void failuresHistoryListChanged();
}

затем my. cpp мы испускаем сигнал каждый раз, когда меняется список (не совсем верно: если одновременно изменяется больше элементов списка, мы испускаем сигнал только один раз, чтобы оптимизировать приложение)

emit failuresHistoryListChanged();

Затем на «стороне» QML мы делаем следующее:

Item
{



// ... other code

//DELAGATE
        Component
        {
            id: failuresDelegateHistory
            Item
            {
                id:                           listHistoryItem
                width:                        listHistory.width
                height:                       10
                anchors.leftMargin: 5
                Row
                {
                    Text{
                        id: failureIdHistory
                        width: 30
                        text: qsTr(modelData.codeFailure) + mainSettingsHandler.emptyString
                        color: mainWindow.currentStyleColor.colorRed
                        font.pixelSize: 16
                        horizontalAlignment: Text.AlignHCenter
                    }

                    Text {
                        id: descriptionFailIdHistory
                        width: (listHistoryItem.width-failureIdHistory.width)*0.5

                        color:mainWindow.currentStyleColor.colorWhite
                        maximumLineCount: 1
                        text: qsTr(modelData.descriptionFail) + mainSettingsHandler.emptyString
                        wrapMode: Text.WrapAnywhere
                        horizontalAlignment: Text.AlignJustify
                        font.pixelSize: 12//16
                    }
                    Text
                    {
                        id: columnTimeStampFailureHistory
                        width: (listHistoryItem.width-descriptionFailIdHistory.width-failureIdHistory.width- 2)
                        maximumLineCount: 1
                        text: modelData.dateFail + mainSettingsHandler.emptyString
                        wrapMode: Text.WrapAnywhere
                        color:mainWindow.currentStyleColor.colorWhite
                        font.pixelSize: 12
                        horizontalAlignment: Text.AlignJustify
                    }
                }

            }
        }

//LIST
        ListView
        {
            id: list1

            y: labelHistory.y + labelHistory.height+5
            width: (FileConfiguration.widthMenuArea - space - 5)*0.5-1-space
            height: (270 - space) *itemsPerPage
            model: myClass.getFailuresHistory//failuresHistoryTable.getFailuresHisory
            delegate: failuresDelegateHistory
            spacing: 10
            enabled: false
        }           

// ... other code
}

OK; как я уже говорил, это решение частично работает, потому что очень, очень медленно! Когда вызывается:

emit failuresHistoryListChanged();

на стороне c ++, список составляется, но программное обеспечение работает медленно. У нас есть сообщение keepalive, которое устанавливается каждые 300 мс и больше не отправляется в течение пары секунд. Нам нужен более эффективный способ передачи списка в QML. Если мы прокомментируем emit, то программа будет работать в установленные сроки.

Итак, наша цель: мы хотим очень эффективно передать этот список в QML. У вас есть решения, которые включают модификацию кода, который мы вам показали, или новые архитектуры? у тебя есть примеры? мы не являемся экспертами в qml.

Если вам нужна дополнительная информация, обратитесь к нам.

Мы заранее благодарим вас, мы давно пытаемся решить эту проблему. спасибо

...