Совместное перемещение QComboBox вместе со столбцом QTableWidget
Можно ли сделать так, чтобы при перемещении столбца в QTableWidget, QComboBox перемещался вместе с ним, а не раздельно как на скриншоте ниже?

Прилагаю пример использования QComboBox в QtableWidget:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QComboBox, QVBoxLayout
class TableWidget(QTableWidget):
def __init__(self):
super().__init__(1, 2)
self.combo = QComboBox()
self.combo.addItems(['1', '2', '3', '4'])
self.combo.currentIndexChanged.connect(self.getComboValue)
self.setCellWidget(0, 1, self.combo)
def getComboValue(self):
print(self.combo.currentText())
class AppDemo(QWidget):
def __init__(self):
super().__init__()
mainLayout = QVBoxLayout()
table = TableWidget()
mainLayout.addWidget(table)
self.setLayout(mainLayout)
app = QApplication(sys.argv)
demo = AppDemo()
demo.show()
app.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант.
Класс QStyledItemDelegate предоставляет средства отображения и редактирования элементов данных из модели.
import sys
from PyQt5.Qt import *
class StyledItemDelegate(QStyledItemDelegate):
def __init__(self, parent=None):
QStyledItemDelegate.__init__(self, parent)
self.parent = parent
def initStyleOption(self, option, index):
super(StyledItemDelegate, self).initStyleOption(option, index)
cb = self.parent.cellWidget(index.row(), 1)
cb.setGeometry(option.rect)
class TableWidget(QTableWidget):
def __init__(self):
# +++ ---------------> vvvv <--------------- изменил для тестирования
super().__init__(2, 3) # (1, 2)
self.combo = QComboBox()
self.combo.setObjectName('combo')
self.combo.addItems(['1', '2', '3', '4'])
self.combo.currentIndexChanged.connect(
lambda i, cb=self.combo : self.getComboValue(i, cb))
self.setCellWidget(0, 1, self.combo)
# +++ vvvvvvvvvvvv <----------- добавил для тестирования
self.combo_2 = QComboBox()
self.combo_2.setObjectName('combo_2')
self.combo_2.addItems(['1', '2', '3', '4'])
self.combo_2.currentIndexChanged.connect(
lambda i, cb=self.combo_2 : self.getComboValue(i, cb))
self.setCellWidget(1, 1, self.combo_2)
def getComboValue(self, index, combo):
print(f'objectName={combo.objectName()}; currentText={combo.currentText()};')
class AppDemo(QWidget):
def __init__(self):
super().__init__()
self.table = TableWidget()
mainLayout = QVBoxLayout(self)
mainLayout.addWidget(self.table)
# +++
delegate = StyledItemDelegate(self.table) # +++
self.table.setItemDelegateForColumn(1, delegate) # +++
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = AppDemo()
demo.resize(500, 300)
demo.show()
sys.exit(app.exec())
