gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:04 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com