В приложении Qt Widget (c++) часть моего файла *.ui состоит из QListView с двумя элементами QTextEdit, как показано на рисунке ниже.
Как видите, пользовательский виджет включает в себя два QTextEdit, каждый из которых имеет свой текст и таблицу стилей. Когда я искал в сети, есть такие решения, как классы HtmlDelegate для рендеринга текста элементов в QListView. Но эти классы представляют только ОДИН QTextEdit как элемент для QListView. В будущем я хочу синхронизировать статус прокрутки QListView со статусом QMultimedia, таким как приложения Podcast. У кого-нибудь есть идеи?
Максимум 120 предметов!
120 не так уж и много. Тогда я думаю, вы можете просто поместить виджеты в QVBoxLayout, а затем в QScrollArea. Вам не нужно возиться с QListView и всеми сложными вещами с редактируемыми делегатами.





Ну, во-первых, вы должны создать свой собственный виджет следующим образом:
Затем вы добавляете его в свою модель QListView с помощью функции setIndexWidget следующим образом:
QStandardItemModel *model = new QStandardItemModel(120, 1);
ui->listView->setModel(model);
for (int r = 0; r < 120; r++)
{
ui->listView->setIndexWidget(model->index(r, 0), new CustomTextEdits);
}
Конечный результат:
вы можете увидеть исходный код здесь:
Мне непонятно, но не могли бы мы использовать QML, ListView, ListModel для обработки данных и рендеринга?
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtQuick3D
Page {
ListView {
anchors.fill: parent
model: ListModel {
id: items
Component.onCompleted: {
for (let i = 0; i < 20; i++) {
let enText = "English Text " + (i + 1);
let itText = "Its Translate " + (i + 1);
append( { enText, itText } );
}
}
}
ScrollBar.vertical: ScrollBar {
width: 20
policy: ScrollBar.AlwaysOn
}
spacing: 2
delegate: Frame {
width: ListView.view.width - 20
background: Rectangle {
border.color: "black"
border.width: 2
}
ColumnLayout {
width: parent.width
TextInput {
Layout.fillWidth: true
text: enText
horizontalAlignment: Qt.AlignHCenter
font.pointSize: 12
onAccepted: enText = text
}
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: 2
color: "steelblue"
}
TextInput {
Layout.fillWidth: true
text: itText
horizontalAlignment: Qt.AlignHCenter
font.pointSize: 12
font.italic: true
color: "red"
onAccepted: itText = text
}
}
}
}
}
Вы можете Попробовать онлайн!
Если мы хотим иметь что-то подобное в QML, Repeater — лучший выбор, не так ли? Ваш ответ поднимает этот вопрос для меня.
И Repeater, и ListView похожи в том, что они оба поддерживают модель. Преимущество ListView в том, что он имеет встроенный «текущий» элемент, возможность пролистывания и полосу прокрутки. OP указал, что статус прокрутки важен и уже использует QListView. Но, если честно, точный вариант использования был несколько расплывчатым.
Сколько пунктов вы ожидаете иметь в своем списке?