我如何将 TableWidget 的 CellWidget 与 pyqt5 中的项目中心对齐

How can i align a CellWidget of a TableWidget to the center of the Item in pyqt5

我在 tableWidget 中有一个组合框,verticalHeader DefaultSectionSize 是 60。

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self,parent)
        self.table = QTableWidget()
        self.setCentralWidget(self.table)
       
        self.table.verticalHeader().setDefaultSectionSize(60)
        self.table.setColumnCount(2)
        self.table.setRowCount(2)
        
        data = ["1","2"]
    
        for i in range(2):
            item = QTableWidgetItem(data[i])
            self.table.setItem(i,0,item)
            self.combo_sell = QComboBox()
            self.combo_sell.setMaximumHeight(30)
            self.table.setCellWidget(i,1,self.combo_sell)

但是由于我将 comboBox 的最大尺寸设置为 30,所以它停留在项目的顶部。

我想知道有没有办法把它居中对齐

设置索引小部件时,视图会尝试根据索引的 visualRect() 设置小部件几何形状。设置固定尺寸会强制小部件将自身与默认原点对齐,通常是左上角。

使具有固定高度的小部件垂直居中的唯一方法是使用具有垂直框布局的容器并将组合添加到其中:

        for i in range(2):
            item = QTableWidgetItem(data[i])
            item.setTextAlignment(Qt.AlignCenter)
            self.table.setItem(i,0,item)
            container = QWidget()
            layout = QVBoxLayout(container)
            combo_sell = QComboBox()
            layout.addWidget(combo_sell)
            combo_sell.setMaximumHeight(30)
            self.table.setCellWidget(i, 1, container)

注意:在 for 循环中设置实例属性是没有意义的,因为每次循环都会丢失引用。

如果您需要对组合的简单引用,可以将其设置为小部件的属性:

    container.combo_sell = QComboBox()

通过这种方式,您可以在需要时轻松访问它:

        widget = self.table.cellWidget(row, column)
        if widget and hasattr(widget, 'combo'):
            combo = widget.combo
            print(combo.currentIndex())

请注意,引用是为小部件的 python 包装器创建的,该行为可能会在 Qt 的未来版本中发生变化。实现此目的的更好和更安全的方法是使用子类,这也可以更轻松地访问组合:

class TableCombo(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        self.combo = QComboBox()
        layout.addWidget(self.combo)
        self.combo.setMaximumHeight(30)
        self.currentIndex = self.combo.currentIndex
        self.setCurrentIndex = self.combo.setCurrentIndex
        self.addItems = self.combo.addItems

# ...

            combo_sell = TableCombo()
            self.table.setCellWidget(i, 1, combo_sell)

# ...

        combo = self.table.cellWidget(row, column)
        print(combo.currentIndex())