python - PyQT:在 QListWidgetItem 中获取内容 CustFormWidgetIem
问题描述
我有一个CustomFormWidgetItem
我添加到一个QListWidgetItem
.
在主小部件中,我试图在CustomFormWidgetItem
by上查询值
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 所指出的,它的代码基于我之前的回答,其中指出在这些情况下最好将数据保存在 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())
推荐阅读
- excel - 如果存在则更新,否则插入
- ios - 如何在ios中以编程方式从后台删除应用程序
- c++ - 在 C++ 中,您可以像比较类型一样比较模板吗?
- javascript - SyntaxError:带有 mocha 和 babel 的意外标识符
- linux - 在特定位置获取单词后的文本
- php - 用户创建给了我不正确的 ID 值
- java - 找不到调用两个点到一个方法的麻烦。“Java - 距离点”
- python-3.x - python 上的辛普森集成
- ruby-on-rails - Ruby on Rails 语法错误,意外的输入结束,期望关键字_end end ^
- angularjs - ANGULARJS:未捕获的错误:语法错误,无法识别的表达式:#!/