使用python编辑QlistWidget中一行的一部分

时间:2019-02-11 17:05:10

标签: python pyqt5 qt-designer

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

以下是我的代码。

o <- outer(l1, l2, FUN=distfunc)
dimnames(o) <- list(l1, l2)
o
#   a b c d
# a 0 1 2 3
# b 1 0 1 2
# c 2 1 0 1

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

  

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

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

1 个答案:

答案 0 :(得分:1)

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

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_())