QML ListView: как скопировать выбранный элемент в буфер обмена? - PullRequest
1 голос
/ 19 января 2020

У меня есть ListView с текстовыми элементами:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 300
    height: 300

    ListModel {
        id: listModel
        ListElement {
            name: "Bill Smith"
        }
        ListElement {
            name: "John Brown"
        }
        ListElement {
            name: "Sam Wise"
        }
    }

    ListView {
        anchors.fill: parent

        model: listModel
        delegate: Text {
            text: model.name
            width: ListView.view.width

            MouseArea {
                anchors.fill: parent
                onClicked: parent.ListView.view.currentIndex = model.index
            }
        }

        highlight: Rectangle {
            color: 'light grey'
        }
    }
}

Пользователь может выбрать элемент в этом списке одним щелчком мыши. Я хочу скопировать текст выбранного элемента в буфер обмена с помощью Ctrl + C.

. Есть ли простое решение этой задачи? Возможно ли сделать это в QML только без кода C ++?

1 Ответ

3 голосов
/ 19 января 2020

Как правило, вы должны использовать QClipBoard, поскольку ответы на этот вопрос указывают на то, что объект QClipBoard недоступен из QML, но для обходного пути используется невидимый TextEdit, поскольку этот объект может сохранять текст в буфере обмена:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 300
    height: 300

    ListModel {
        id: listModel
        ListElement {
            name: "Bill Smith"
        }
        ListElement {
            name: "John Brown"
        }
        ListElement {
            name: "Sam Wise"
        }
    }

    ListView {
        id: listView
        anchors.fill: parent
        model: listModel
        delegate: Text {
            text: model.name
            width: ListView.view.width

            MouseArea {
                anchors.fill: parent
                onClicked: parent.ListView.view.currentIndex = model.index
            }
        }
        highlight: Rectangle {
            color: 'light grey'
        }
    }
    TextEdit{
        id: textEdit
        visible: false
    }
    Shortcut {
        sequence: StandardKey.Copy
        onActivated: {
            textEdit.text = listModel.get(listView.currentIndex).name
            textEdit.selectAll()
            textEdit.copy()
        }
    }
}
...