首页 > 解决方案 > 使用 python 编辑 QlistWidget 中的部分行

问题描述

当 button1 被按下时,我放置在窗口内的列表小部件会打印出值 (0 - 1000)。但其中一些值是 0,表示错误。用户应使用任何其他正整数更新这些值。按下按钮 2 确认该值后,列表将被更新或显示错误,需要进一步更新。

以下是我的代码。

import Ui_ImageSort # designed using Qt-Designer
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow, QListWidgetItem

class ImageSort(Ui_ImageSort.Ui_MainWindow, QMainWindow):
    def __init__(self):
        super(ImageSort, self).__init__()
        self.setupUi(self)

    self.pushButton_1.clicked.connect(list_view)
    self.pushButton_2.clicked.connect(print_scales)

    def list_view(self):
        self.listWidget.clear()
        for i in range(len(self.scale_txt)):
            item = QListWidgetItem(str(self.scale_txt[i]))
            self.listWidget.addItem(str(i + 1) + ") " + item.text())            

    def print_scales(self):
        self.listWidget.clear()
        error = 0
        for i in range(len(self.scale_txt)):
            if (self.scale_txt[i]==0):
                error = 1

        if (error ==0):
            self.listWidget.addItem("\nThe scale values are confirmed ")
            for i in range(len(self.scale_txt)):
                    print(self.scale_txt[i])
                    print("\n")
        else:
            self.listWidget.addItem("\nThe scale values have an error")
            self.listWidget.addItem("Press button 1 again to edit")

我只想编辑 listwidget 打印出来的数字。输出将如下所示:

1) 100 微米
2) 200 微米
3) 0 微米
4) 100 微米

值 0 需要更正。所以它应该被标记为红色。并且用户可以在不影响剩余线(“微米”)的情况下进行更改。例如:“0 微米”是无效的,标记为红色,应该是可编辑的,但是当用户将其替换为其他数字后,按下按钮 2 后,它变为有效,因此变为黑色,不再可编辑。

标签: pythonpyqt5qt-designer

解决方案


一种可能的解决方案是使用委托,数据通过角色传递:

from PyQt5 import QtCore, QtGui, QtWidgets

MaskRole = QtCore.Qt.UserRole + 1000

class ListDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        mask = index.data(MaskRole)
        if mask is not None:
            editor = QtWidgets.QLineEdit(parent)
            editor.setInputMask(mask)
            return editor

    def setModelData(self, editor, model, index):
        if editor.hasAcceptableInput():
            text = editor.text()
            model.setData(index, text, QtCore.Qt.DisplayRole)

        re = QtCore.QRegularExpression(r"(\d+)\) (\d+) microns")
        match = re.match(index.data())
        color = QtGui.QColor("red")
        if match.hasMatch():
            val = match.captured(match.lastCapturedIndex())
            if val != "0":
                color = QtGui.QColor("black")
        model.setData(index, color, QtCore.Qt.ForegroundRole)

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QListWidget()
    delegate = ListDelegate(w)
    w.setItemDelegate(delegate)
    scales = [100, 200, 0, 500, 0, 300, 0]
    for i, scale in enumerate(scales):
        item = QtWidgets.QListWidgetItem()
        if scale == 0:
            item.setData(MaskRole, "{}) 900 micro\\ns".format(i))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
            item.setForeground(QtCore.Qt.red)
        item.setText("{}) {} microns".format(i, scale))
        w.addItem(item)
    w.show()
    sys.exit(app.exec_())

推荐阅读