使用 python 编辑 QlistWidget 中的部分行
Posted
技术标签:
【中文标题】使用 python 编辑 QlistWidget 中的部分行【英文标题】:To edit part of a line in a QlistWidget using python 【发布时间】:2019-02-11 17:05:10 【问题描述】:当 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")
我只想编辑列表小部件打印出来的数字。输出将如下所示:
1) 100 微米 2) 200 微米 3) 0 微米 4) 100 微米
值 0 需要更正。所以它应该被标记为红色。并且用户可以在不影响剩余线(“微米”)的情况下进行更改。例如:“0 微米”是无效的,标记为红色,应该是可编辑的,但是当用户将其替换为其他数字后,按下按钮 2 后,它变为有效,因此变为黑色,不再可编辑。
【问题讨论】:
你可以更好地解释自己 我做了一些改动 你指出0是一个无效值,这只是一个例子,你没有更通用的标准吗?例如-50是有效的,有效值只是正数吗? 50.5 有效吗? PyQt4 还是 PyQt5?? 我使用 PyQt5(我会更新标签)。我打算只将正整数值添加到列表中。在添加列表之前,我通过将值的准确性与现有图像进行比较来进行一些比较检查。在有问题的情况下,我将 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_())
【讨论】:
对不起,将if editor.hasAcceptableInput ():
这一行改成if editor.hasAcceptableInput() and model.data(index)!=editor.text():
会更正确吗?
@S.Nick 你为什么这么认为?
@S.Nick 我假设如果已经采用了可接受的值,则该项目不应该是可编辑的,因此将始终进行第二次检查。
@abk 1. 900 与 MVC 无关,这与 QLineEdit 的输入掩码有关,更多信息请阅读:doc.qt.io/qt-5/qlineedit.html#inputMask-prop。 2.您的第二个问题我无法回答,因为我不知道它的代码是如何得到的,因为它没有提供minimal reproducible example。最后,你测试我的代码了吗?它是否按您的要求工作?
@abk 也许您有一个想法,您的问题没有正确表达,因此我理解了其他内容,我第三次要求您改进您的问题,使其清晰简洁混乱以上是关于使用 python 编辑 QlistWidget 中的部分行的主要内容,如果未能解决你的问题,请参考以下文章
QListWidget::setEditTriggers(QAbstractItemView::AnyKeyPressed) 不工作
在QT中怎么隐藏QComboBox的下拉列表并当单击QComboBox的编辑框时,就弹出QListWidget窗口
Python:在 QListWidget 中捕获重新排序事件?
Python PyQt4 QFileDialog 图像并在 QListWidget 中加载