QListWidget,使用用户输入重命名项

2024-06-24 12:31:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我将contextmenu添加到带有删除和重命名项的listWidget。对于delete,我使用了RemoveRow。但是,我无法使用用户输入重命名。如何用允许用户更改名称的操作替换此行item.setText('new_name')

import sys
from PyQt5 import QtCore, QtWidgets

class Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__()
        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.addItems('apple orange lemon'.split())
        self.listWidget.installEventFilter(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.listWidget)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.ContextMenu and
            source is self.listWidget):
            menu = QtWidgets.QMenu()
            Delete = menu.addAction('Delete')
            Rename = menu.addAction('Rename')
            #action = menu.exec_(event.globalPos())
            action = menu.exec_(self.mapToGlobal(event.pos())) #when inside self
            if action == Delete:
                item = source.itemAt(event.pos())
                source.model().removeRow(source.currentRow())
            elif action == Rename:
                item = source.itemAt(event.pos())
                #
                item.setText('new')
                "How can I rename by user input, not by setText??"
                
            return True
        return super(Dialog, self).eventFilter(source, event)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Dialog()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

Tags: selfeventsourceifsysactionitemdelete
1条回答
网友
1楼 · 发布于 2024-06-24 12:31:18

您可以使用QInputDialog.getText()请求新文本,并将其与setText()一起使用

elif action == Rename:

    text, okPressed = QtWidgets.QInputDialog.getText(self, "New name","New name:")
    
    if okPressed and text != '':
        item = source.itemAt(event.pos())
        item.setText(text)

您甚至可以将文本从列表复制到QInputDialog,以便用户可以对其进行编辑

elif action == Rename:

    item = source.itemAt(event.pos())

    text, okPressed = QtWidgets.QInputDialog.getText(self, "New name","New name:", text=item.text())
    
    if okPressed and text != '':
        item.setText(text)

完整工作代码

import sys
from PyQt5 import QtCore, QtWidgets

class Dialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__()
        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.addItems('apple orange lemon'.split())
        self.listWidget.installEventFilter(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.listWidget)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.ContextMenu and
            source is self.listWidget):
            menu = QtWidgets.QMenu()
            Delete = menu.addAction('Delete')
            Rename = menu.addAction('Rename')
            #action = menu.exec_(event.globalPos())
            action = menu.exec_(self.mapToGlobal(event.pos())) #when inside self
            if action == Delete:
                item = source.itemAt(event.pos())
                source.model().removeRow(source.currentRow())
            elif action == Rename:

                item = source.itemAt(event.pos())

                text, okPressed = QtWidgets.QInputDialog.getText(self, "New name","New name:", text=item.text())
    
                if okPressed and text != '':
                     item.setText(text)
                
            return True
        return super(Dialog, self).eventFilter(source, event)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Dialog()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

相关问题 更多 >