代码之家  ›  专栏  ›  技术社区  ›  spitfiredd

PyQT:获取QListWidgetItem内的内容custformWidgetItem

  •  1
  • spitfiredd  · 技术社区  · 6 年前

    我有一个 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
    

    我想把实际的物品放在盒子里 ,我怎样才能买到那件东西?

    编辑(添加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_())
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   eyllanesc Yonghwan Shin    6 年前

    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())
    
    推荐文章