#qt #qml #qtquick2
#qt #qml #qtquick2
Вопрос:
Я использовал диалоговое окно file для выбора нескольких изображений, подобных этому :
FileDialog{
id: uploadFiles
title: "Please choose images for dimple detection"
selectMultiple: true
nameFilters: [ "Image files (*.jpg *.png *.tif)", "All files (*)" ]
onAccepted: {}
}
Я знаю, что могу найти пути к файлам, используя:
uplaodFile.fileUrls
но как я могу отобразить их в изменяемом элементе с помощью GridView?
Редактировать: это полный код страницы …
import QtQuick 2.15
import QtQuick.Controls 2.15
import "../controls"
import QtQuick.Dialogs 1.3
Item {
property bool isGridViewVisiable: false
Rectangle {
id: bgHome
color: "#2c313c"
anchors.fill: parent
Flickable{
id: flickableUpload
anchors.fill: parent
clip: true
Text {
id: titleResults
x: 249
width: 347
height: 141
color: "#ffffff"
text: qsTr("Upload the images to here please :)")
anchors.verticalCenter: parent.verticalCenter
anchors.top: parent.top
font.pixelSize: 25
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
anchors.verticalCenterOffset: -110
anchors.horizontalCenterOffset: 8
anchors.topMargin: 59
anchors.horizontalCenter: parent.horizontalCenter
font.family: "Arial"
font.bold: true
minimumPointSize: 15
minimumPixelSize: 16
fontSizeMode: Text.Fit
}
UploadBtn{
id:uploadBtn
x: 285
y: 220
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
btnIconSource: "../../images/svg_images/upload-icon.svg"
onPressed: {
uploadFiles.open()
}
// opening a file dialog in order to upload the images
FileDialog{
id: uploadFiles
title: "Please choose images for dimple detection"
selectMultiple: true
nameFilters: [ "Image files (*.jpg *.png *.tif)", "All files (*)" ]
onAccepted: {
isGridViewVisiable = true
}
}
Component {
id: nameDelegate
Column {
Image {
id: delegateImage
anchors.horizontalCenter: delegateText.horizontalCenter
source: model; width: 256; height: 256; smooth: true
fillMode: Image.PreserveAspectFit
}
Text {
id: delegateText
text: model.name; font.pixelSize: 24
}
}
}
GridView{
id:gridView
visible: isGridViewVisiable
anchors.fill: parent
model:uploadFiles.fileUrls
delegate: nameDelegate
clip: true
}
}
ScrollBar.vertical: ScrollBar{}
}
}
Это полная страница, которую я добавлю в загрузчик содержимого в основной файл qml
PS: кнопка загрузки — это настраиваемая кнопка
Комментарии:
1. Вы пробовали это в своем GridView:
model: uploadFiles.fileUrls
?2. Я проверю, как это использовать. также я был бы признателен, если бы вы привели пример его использования с диалоговыми окнами файлов
Ответ №1:
uploadFiles.fileUrls
представляет собой массив имен файлов. Таким образом, вы можете использовать это в качестве модели для вашего GridView
.
GridView {
model: uploadFiles.fileUrls
delegate: Image {
source: modelData
}
}
Обновить:
Оказывается, была проблема с моим первоначальным ответом, а также с кодом, который вы пытались.
Прежде всего, вы делаете своего GridView
ребенка своим UploadBtn
. Вы это намеревались? Я думаю, что это будет слишком мало места для рисования ваших изображений.
Но что более важно, часть, в которой я ошибался, заключается в том, что fileUrls
это не массив строк. Это list<url>
. Я предположил, что QML будет достаточно умен, чтобы обрабатывать это так же, как массив, или, возможно, неявно преобразовать его в массив, если это необходимо. Но, видимо, я ошибался. Поэтому нам просто нужно использовать его немного по-другому.
Flickable{
...
UploadBtn {
id:uploadBtn
...
FileDialog{
...
}
Component {
id: nameDelegate
Column {
Image {
...
// Access the list by index
source: uploadFiles.fileUrls[index]
}
Text {
...
text: uploadFiles.fileUrls[index]
}
}
}
}
// Move GridView outside of UploadBtn
GridView {
...
// Just use the length of the list as our model
model: uploadFiles.fileUrls.length
}
}
Комментарии:
1. Я пробовал GridView{ id:GridView visible: isGridViewVisiable anchors.fill: родительская модель: uploadFiles.fileUrls делегат: Изображение { id: delegateImage источник:modelData; ширина: 256; высота: 256; плавный: true Режим заполнения: Изображение. PreserveAspectFit } clip: true } и это не сработало или, возможно, по какой-то причине оно не отображается в элементе, который можно перелистывать
2. Для меня код работает нормально. Можете ли вы распечатать содержимое,
fileUrls
чтобы проверить, верны ли пути / имена файлов?3. qml: [file:///C:/Users/yoooo/Desktop/FinalProject/pics_dimpels/1.jpg ,файл:///C:/Users/yoooo/Desktop/Финальный проект/pics_dimpels/2.png,файл:///C:/Users/yoooo/Desktop/Финальный проект/pics_dimpels/2.tif,файл:///C:/Users/yoooo /Рабочий стол / Окончательный Project/pics_dimpels/3.jpg ,файл:/// C:/Users/yoooo/Desktop/Final Project/pics_dimpels/5 — Copy.tif] вот что он выводит при попытке загрузить пять картинок, я отредактирую вопрос и добавлю полный код страницы , может быть, я путаю предметы
4. Если вы просто создаете одно изображение и вручную устанавливаете значение
source
«file:/// C:/Users/yoooo/Desktop/Final Project/pics_dimpels/1.jpg «, работает ли это так, как ожидалось?5. да, это работает, но мне пришлось скрыть текст и кнопку, чтобы их увидеть, поэтому я думаю, что проблема в том, что мне нужно активировать GridView после загрузки изображений, тогда он будет работать… Есть ли у вас какие-либо предложения о том, как динамически активировать его после загрузки изображений?