python - PyQT:获取 QListWidgetItem 内的内容 CustFormWidgetIem

标签 python pyqt pyqt5 qlistwidget qlistwidgetitem

我有一个 CustomFormWidgetItem,我将其添加到 QListWidgetItem 中。

在主小部件中,我尝试通过

查询CustomFormWidgetItem上的值
self.listWidget.currentItemChanged.connect(self.print_info)  # QListWidget

def print_info(self):
    print(self.listWidget.currentItem())
    print(self.listWidget.row(self.ui.catalog_list_wid.currentItem()))

当我单击列表中的任何项目时,

<PyQt5.QtWidgets.QListWidgetItem object at 0x00000209A3831E58>
0  #  This is the row

我想要 QListWidgetItem 中的实际项目,如何获取该项目?

编辑(添加 MVE):

class Roles:
    IdRole = QtCore.Qt.UserRole + 1000
    NameRole = QtCore.Qt.UserRole + 1001
    VersionRole = QtCore.Qt.UserRole + 1002
    InstalledRole = QtCore.Qt.UserRole + 1003

class ParentWid(QtWidgets.QDialog, Ui_ParentWidget):
    def __init__(self, data={}, parent=None):
        super(ParentWid, self).__init__(parent)
        self.data = data
        self.setupUi(self)
        self.set_widget_data()

    def set_widget_data(self):
        for item in self.data:
            lst_item = QtWidgets.QListWidgetItem()
            self.listWidget.addItem(lst_item)
            custFormItem = CustomFormWidget(item, lst_item)
            lst_item.setSizeHint(custFormItem.sizeHint())

    def print_results(self):
        v = (("id", Roles.IdRole), ("name", Roles.NameRole), ("version", Roles.VersionRole), ("installed", Roles.InstalledRole),)
        results = []
        for i in range(self.listWidget.count()):
            it = self.listWidget.item(i)
            d = {}
            for k, r in v:
                d[k] = it.data(r)
            results.append(d)
        print(results)

    # test
    def closeEvent(self, event):
        self.print_results()
        super(ParentWid, self).closeEvent(event)

class CustomFormWidget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, data, item, parent=None):
        super(CustomFormWidget, self).__init__(parent)
        self._item = item
        self._item.listWidget().setItemWidget(self._item, self)
        self.setupUi(self)
        v = (("id", Roles.IdRole), ("name", Roles.NameRole), ("version", Roles.VersionRole), ("installed", Roles.InstalledRole),)
        for k, r in v:
            self._item.setData(r, data[k])
        self.update_view()
        self.install_btn.clicked.connect(self.on_click)

    def update_view(self):
        self.pkg_name.setText(self._item.data(Roles.NameRole))
        self.pkg_version.setText(self._item.data(Roles.VersionRole))
        v = self._item.data(Roles.InstalledRole)
        self.install_btn.setText("Installed" if v else "Not Installed")
        self.install_btn.setEnabled(not v)

    @QtCore.pyqtSlot()
    def on_click(self):
        self._item.setData(Roles.InstalledRole, not self._item.data(Roles.InstalledRole))
        self.update_view()

        v = (("id", Roles.IdRole), ("name", Roles.NameRole), ("version", Roles.VersionRole), ("installed", Roles.InstalledRole),)
        for k, r in v:
            print(k, self._item.data(r))


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    data = [
        {
            'id': 1,
            'name': 'pkg-foo',
            'version': '0.1',
            'installed': False
        },
        {
            'id': 2,
            'name': 'pkg-bar',
            'version': '0.1',
            'installed': False
        }
    ]
    w = ParentWid(data)
    w.show()
    sys.exit(app.exec_())

最佳答案

currentItemChanged 信号发送当前和前一个 currentItem,因此我们可以直接使用第一个数据。另一方面,正如OP指出的,它的代码基于 previous answer我在其中指出,在这些情况下,最好将数据保存在 QListWidget 中,因为它有一个内部模型,因此在这种情况下我们可以利用它来获取数据:

class ParentWid(QtWidgets.QDialog, Ui_ParentWidget):
    def __init__(self, data={}, parent=None):
        super(ParentWid, self).__init__(parent)
        self.data = data
        self.setupUi(self)
        self.set_widget_data()
        self.listWidget.currentItemChanged.connect(self.print_info)

    @QtCore.pyqtSlot("QListWidgetItem *", "QListWidgetItem *")
    def print_info(self, current, previous):
        print("="*20)
        v = (("id", Roles.IdRole), ("name", Roles.NameRole), ("version", Roles.VersionRole), ("installed", Roles.InstalledRole),)
        for k, r in v:
            print(k,  current.data(r))

    def set_widget_data(self):
        for item in self.data:
            lst_item = QtWidgets.QListWidgetItem()
            self.listWidget.addItem(lst_item)
            custFormItem = CustomFormWidget(item, lst_item)
            lst_item.setSizeHint(custFormItem.sizeHint())

关于python - PyQT:获取 QListWidgetItem 内的内容 CustFormWidgetIem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53710390/

相关文章:

python - 我如何转换 .在PyQt5的QLineEdit中输入0.?

python - 计时器无法从另一个线程停止 - 删除焦点

python - Django queryset 对象返回 None 而不是 0,即使数据库将 0 存储为字段值

python - PyQt QTabBar 不创建新选项卡

用于创建图像镜像并将其与一定量的白色混合的 Python 代码。

python - pyqt中标签随时间变化

python - 如何在PyQt5中捕获libpng错误错误的自适应滤波器

python - Qtablewidget去除黑色空间PyQt5

python - 如何使用plotlyexpress向折线图添加点或标记?

python - pyplot绘制子图的方法