以上代码运行显示:Internal C++ object (MultiSelectComboBoxTableWidget) already deleted
时间: 2024-02-29 19:53:25 浏览: 250
这个错误通常是因为 PyQt/PySide 中的对象在 Python 中被删除,但在 C++ 中仍然存在。这通常是由于 Python 中的对象超出了其作用域并被垃圾回收器删除引起的。
为了解决这个问题,你可以将 table widget 对象作为主窗口的成员变量,这样它就不会在 Python 中被删除。修改后的代码如下:
```python
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QComboBox, QCheckBox, QPushButton, QVBoxLayout, QWidget
class MultiSelectComboBoxTableWidget(QTableWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setColumnCount(2)
self.setRowCount(3)
self.setHorizontalHeaderLabels(["Multi-Select", "Single-Select"])
for i in range(self.rowCount()):
checkbox = QCheckBox()
self.setCellWidget(i, 0, checkbox)
combobox = QComboBox()
combobox.addItems(["Option 1", "Option 2", "Option 3"])
self.setCellWidget(i, 1, combobox)
checkbox.stateChanged.connect(self.on_checkbox_state_changed)
self.button = QPushButton("Get Selected Data")
self.button.clicked.connect(self.on_button_clicked)
layout = QVBoxLayout()
layout.addWidget(self)
layout.addWidget(self.button)
widget = QWidget()
widget.setLayout(layout)
self.selected_data = []
def on_checkbox_state_changed(self, state):
checkbox = self.sender()
row = self.indexAt(checkbox.pos()).row()
if state == Qt.Checked:
self.selected_data.append((row, self.cellWidget(row, 1).currentText()))
else:
self.selected_data.remove((row, self.cellWidget(row, 1).currentText()))
def on_button_clicked(self):
print(self.selected_data)
class MainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.table_widget = MultiSelectComboBoxTableWidget()
layout = QVBoxLayout()
layout.addWidget(self.table_widget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
```
这个示例代码中创建了一个名为 MainWindow 的主窗口,并将 MultiSelectComboBoxTableWidget 作为其成员变量。这样在程序运行期间,table widget 对象就不会被删除,就不会出现 `Internal C++ object already deleted` 的错误了。
阅读全文