当我按下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,则它变为有效,因此变成黑色,因此不再可编辑。
答案 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_())