python - 使用 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 后,它变为有效,因此变为黑色,不再可编辑。
解决方案
一种可能的解决方案是使用委托,数据通过角色传递:
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_())
推荐阅读
- elasticsearch - 弹性搜索中缺少日志索引
- c# - 检查和评估有什么区别?
- analytics - 分析平台如何处理用户删除?他们还有一个内部标识符来代表用户吗?
- php - 在远程服务器上运行 laravel
- python - 如何纠正此错误:“换行符”是此函数的无效关键字参数
- c# - 运行项目 netcore 时出现错误 "{"stateMachine":{"<>1__state":-2,"<>t__builder":{"
- matlab - 为什么 Matlab 和 Octave 给出相同方程的结果略有不同?我该如何解决?
- vb.net - VB 加密 XML 错误 0x00 无效
- c# - 使用控制器单击按钮时如何更改 TextArea 文本?
- c# - 如何在 Selenium c# 中断言分配给 ElementId 的值?