使用 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 中加载

Python:如何在 PyQt 中查询 QListWidget 中的多个选定项

python 将QWidget添加到QListWidget