Добрый вечер,
Мы программируем плату 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.
Если вам нужна дополнительная информация, обратитесь к нам.
Мы заранее благодарим вас, мы давно пытаемся решить эту проблему. спасибо