PyQT4:在 Qtableview 中添加组合框

PyQT4: Adding combobox in Qtableview

我是 PyQT 新手。

我有兴趣向 tableView 的每一行添加一个组合框。在 PyQT 4 中可以吗?

我知道,在 QT5 中可以,但不确定 PyQT。

提前感谢您的帮助。

是否需要使用 QTableView or can you do it using a QTableWidget 来完成?

假设您可以使用小部件与视图,您可以轻松地将组合框(或 any widget)添加到单元格。


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.table = QtGui.QTableWidget()
        self.table.setColumnCount(3)
        self.setCentralWidget(self.table)
        data1 = ['row1','row2','row3','row4']
        data2 = ['1','2.0','3.00000001','3.9999999']
        combo_box_options = ["Option 1","Option 2","Option 3"]

        self.table.setRowCount(4)

        for index in range(4):
            item1 = QtGui.QTableWidgetItem(data1[index])
            self.table.setItem(index,0,item1)
            item2 = QtGui.QTableWidgetItem(data2[index])
            self.table.setItem(index,1,item2)
            combo = QtGui.QComboBox()
            for t in combo_box_options:
                combo.addItem(t)
            self.table.setCellWidget(index,2,combo)

这里的重要部分是:

combo_box_options = ["Option 1","Option 2","Option 3"]

这是您希望组合框包含的值列表。在这个例子中,有三个选项。

for t in combo_box_options:
    combo.addItem(t)
self.table.setCellWidget(index,2,combo)

此块按行设置组合框,然后将其添加到单元格(本例中的最后一个单元格)。

上面的代码块产生如下输出:

如果你真的想使用QTableView,那么它有一个叫做setIndexWidget的特殊方法,你只需要在你想放置小部件的地方建立索引。小例子。

    model = QStandardItemModel (4, 4)
    for row in range(4):
        for column in range(4):
            item = QStandardItem("row %d, column %d" % (row, column))
            model.setItem(row, column, item)

    self.tableView.setModel(model)
    for row in range(4):
        c = QComboBox()
        c.addItems(['cell11','cell12','cell13','cell14','cell15',])
        i = self.tableView.model().index(row,2)
        self.tableView.setIndexWidget(i,c)

结果与第一个答案相似。

感谢 @Kosovan 建议 setIndexWidget(index, widget) 将小部件添加到 qtableview

在下面的代码中使用 PySide6 但可以很容易地修改为 PyQt

要向 QTableView 添加小部件,请使用 setIndexWidget

self.tableView.setIndexWidget(self.tableView.model().index(3, 1), QPushButton("Kill"))

self.tableView.setIndexWidget(self.tableView.model().index(3, 2), QFontComboBox())

来源:

#!/usr/bin/env python3.10

import sys
import time

from typing import Union, Any

import PySide6
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QTableView,
                               QPushButton, QFontComboBox)
from PySide6.QtCore import (Qt, QAbstractTableModel)
from PySide6.QtGui import (QColor)


class TableModel(QAbstractTableModel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.values = [["Hello", 2, 5],
                       [22, 55, 6],
                       [2.3, "Kion", time.time()],
                       [2.22, "widget-here", "another-widget-here"]]
        self.initUI()

    def initUI(self):
        pass

    def rowCount(self, index):
        return len(self.values)

    def columnCount(self, index):
        return len(self.values[0])

    def data(self, index: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex],
             role: int = ...) -> Any:
        if role == Qt.DisplayRole:
            return self.values[index.row()][index.column()]


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.tableView = QTableView()
        self.tableModel = TableModel()
        self.tableView.setModel(self.tableModel)
        self.tableView.setIndexWidget(self.tableView.model().index(3, 1), QPushButton("Kill"))
        self.tableView.setIndexWidget(self.tableView.model().index(3, 2), QFontComboBox())

        self.setCentralWidget(self.tableView)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    app.exec()

输出: