Я занимаюсь разработкой приложения с Qt 5.13.0 на профессиональном компьютере с Windows 10. Мне нужно создать вид сообщения в стиле WhatsApp, и для этого я использовал компонент GridView в качестве основы. Тем не менее, чтобы правильно нарисовать сообщения, мне нужно создать каждую строку GridView с разной высотой, в зависимости от текста сообщения.
Но, к моему удивлению, я не смог найти какое-либо решение в Интернете для достиженияэто, хотя я думал, что это была простая формальность. Я попробовал решение самостоятельно, которое я приложил ниже, однако оно не работает. Проблема в том, что все строки принимают высоту последнего измененного размера.
Я не сомневаюсь, что Qt может сделать это, к сожалению, я искал несколько дней, и я не могу найти решение дляЭта проблема. Я просто понятия не имею, как этого добиться. Таким образом, кто-то может объяснить мне, как создать GridView со строками переменной высоты, или если GridWiew не является подходящим компонентом для этого, который я должен использовать вместо этого?
Вот мой файл qss:
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.12
import QtQuick.Layouts 1.11
Window
{
visible: true
width: 640
height: 480
title: qsTr("Grid view")
color: "#ffffff"
ColumnLayout
{
transformOrigin: Item.Center
spacing: 0
x: 0
y: 0
width: parent.width
height: parent.height
/**
* Grid view item
*/
Component
{
id: itGridItem
Item
{
Column
{
Rectangle
{
property int messageWidth: (gvMessageGrid.cellWidth / 2) - 50
id: itemRect
x: senderIsMyself ? 25 : gvMessageGrid.cellWidth - (25 + messageWidth)
y: 5
width: messageWidth
height: itemTextID.height + 20
color: senderIsMyself ? "#d5d5d5" : "#800b940e"
radius: 5
clip: true
Text
{
id: itemTextID
width: parent.width - 20
text: itemText
renderType: Text.NativeRendering
textFormat: TextEdit.RichText
wrapMode: Text.WordWrap
font.family: "Segoe UI Emoji"
font.pixelSize: 18
anchors.margins: 10
anchors.left: parent.left
anchors.top: parent.top
color: "#101010"
}
onHeightChanged: gvMessageGrid.cellHeight = height + 10
}
}
}
}
/**
* Messages grid view
*/
GridView
{
id: gvMessageGrid
y: 0
Layout.fillHeight: true
flickableDirection: Flickable.VerticalFlick
Layout.fillWidth: true
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
clip: true
contentWidth: 700
contentHeight: 300
cellWidth: contentWidth
cellHeight: 150
model: lmGridModel
delegate: itGridItem
ScrollBar.vertical: ScrollBar
{
visible: true
}
onWidthChanged: cellWidth = width
}
}
}
--- Отредактировано 18 октября 2019 г.
Следуя приведенному ниже предложению eyllanesc, вот 2 скриншота того, что я хочу и что я получаю:
что я хочу

что я получаю

ПРИМЕЧАНИЕ Я использую несколько языков для целей тестирования, потому что мое приложение должно иметь международную поддержку. Однако проблема, с которой я сталкиваюсь, не имеет к этому никакого отношения, то есть это не ошибка при вычислении текста, потому что 1. Размеры зеленого прямоугольника вокруг текста всегда правильные, и 2. Я сталкиваюсь с точно такой же проблемой с чисто английским текстом.