Совместное перемещение QComboBox вместе со столбцом QTableWidget

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

Скриншот раздельного перемещения QComboBox и QTableWudget


Прилагаю пример использования 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())

введите сюда описание изображения

→ Ссылка