我有一个添加到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())
按下按钮时调用函数-pyqt - python我是新来的人...单击“ btn_brow_3”时,我将调用函数“ funcion”怎么办?有人可以帮助我吗?错误TYPE ERROR connect()插槽参数应该是可调用的或信号不是“ nonetype”问候马克西import atexit import sys from PyQt4 import QtGui import os # Libreria p…
PyQt:如何在QStackedWidget中切换小部件 - python我有两个按钮(wgtbtnA和wgtbtnB)放置在父对象(objectName:stackedWidget)内的两个不同页面(分别为page1和page2)上。我的难题是:运行代码时,箭头不会在PyQt中显示。为什么?如何从第1页切换到第2页,反之亦然?这是运行时的图像,传达了我的要求:Qt Designer:我想保留那些小的后箭头。下面是我的代码:# -…
用大写字母拆分字符串,但忽略AAA Python Regex - python我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…
Python SimpleHTTPServer接收文件 - python我正在使用SimpleHTTPServer的do_POST方法来接收文件。如果我使用curl上传png文件,则脚本运行良好,但是每当我使用python请求库上传文件时,文件都会上传但损坏。这是SimpleHTTPServer代码#!/usr/bin/env python # Simple HTTP Server With Upload. import os …
字符串文字中的正斜杠表现异常 - python为什么S1和S2在撇号位置方面表现不同?S1="1/282/03/10" S2="4/107/03/10" R1="".join({"N\'" ,S1,"\'" }) R2="".join({"N\'…