Текст QListWidgetItem не может быть выделен/выделен

Я использую qt5.2.1 на RHEL6.

Помимо использования QTextBrowser или переписывания нового виджета, который использует QLabel вместо QListWidgetItem, как QListWidget, как я могу сделать текст отдельно выбираемым с помощью указателя мыши?

Например, в текстовом редакторе, таком как vim, вы можете перетащить и щелкнуть кнопку мыши по тексту и отпустить мышь, а затем вы можете щелкнуть средней кнопкой мыши в другом редакторе или терминале, и он вставит его. Я знаю, как это сделать с помощью QClipboard, но проблема в том, что текст изначально нельзя выделить. Я по-прежнему хочу, чтобы всю строку можно было выбрать одним щелчком мыши, поэтому я использую QListWidget, но если я удерживаю и перетаскиваю мышь, я хотел бы иметь возможность выбирать отдельный текст.

TL;DR: у QLabel есть функция setTextInteractionFlags, где вы можете сделать его мышью selectable, как я могу сделать это для QListWidgetItem?


person RidesTheShortBus    schedule 05.03.2015    source источник


Ответы (1)


в QListWidget можно использовать setEditTriggers(QtWidgets.QAbstractItemView.SelectedClicked) и для всех элементов setFlags(QtCore.Qt.ItemIsSelectable|QtCore.Qt.ItemIsEnabled|QtCore.Qt.ItemIsEditable), тогда при первом щелчке элемент выбирается,

элемент выбран

на втором текст дыры

выделен весь текст

а часть текста можно выделить мышкой

выделена часть текста

Изменить 24.03.2015

Чтобы предотвратить редактирование пользователем таким образом, подкласс QstyledItemDelegate (я сделал это в PyQt5)

class MyDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self):
        QtWidgets.QStyledItemDelegate.__init__(self) 

    def setModelData(self,editor,model,index):
        pass # no changes are written to model

и используйте этот делегат для listwidget:

self.delegate = MyDelegate()
self.listWidget.setItemDelegate(self.delegate)

пользователи могут удалять или изменять текст элементов, когда редактирование завершено, появляется исходный текст

Редактировать 25.03.15: добавить

def eventFilter(self,editor,event):
    if event.type() == QtCore.QEvent.KeyPress and event.key() not in (QtCore.Qt.Key_Control, QtCore.Qt.Key_C):
        return True
    return QtWidgets.QStyledItemDelegate.eventFilter(self, editor, event)

делегату и пользователи не могут редактировать текст пунктов, они могут только копировать у него

person a_manthey_67    schedule 22.03.2015
comment
Это работает, но элемент может быть изменен пользователем таким образом. Они могут выделить текст, а затем удалить выделенный текст. Я хочу, чтобы его можно было редактировать только через диалоговое окно, которое я использую, когда пользователь дважды щелкает элемент. - person RidesTheShortBus; 24.03.2015