将带有小部件和文本的行附加到 QStandardItemModel

Posted

技术标签:

【中文标题】将带有小部件和文本的行附加到 QStandardItemModel【英文标题】:Appending a row with widgets and text to a QStandardItemModel 【发布时间】:2021-08-11 13:50:44 【问题描述】:

我想在QTableView 中将QWidget 附加到QStandardItemModel

self.table = QTableView()
self.ui.scrollArea.setWidget(self.table)  #Not important but I left it in in case it had something to do with this question
self.model = QStandardItemModel()
self.table.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.table.setModel(self.model)


...


@Slot(None)
    def OpenFile(self):
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFiles)
        
        if dialog.exec():
            filenames = dialog.selectedFiles()

        for i in range(len(filenames)):
            it = QStandardItem()
            it.setText(filenames[i].split("/")[-1])
            self.samplespinbox = QDoubleSpinBox()
            self.formatdropdown = QComboBox()
            samplespinboxholder = QStandardItem()
            samplespinboxholder.setData(self.samplespinbox)
            formatdropdownholder = QStandardItem()
            formatdropdownholder.setData(self.samplespinbox)
            self.model.appendRow((it ,samplespinboxholder, formatdropdownholder))

但是当我尝试这个时,行会出现,it 会显示,但我使用的小部件不会显示

【问题讨论】:

请注意,在循环中设置实例属性(例如,self.samplespinbox = ...)完全没有意义。只需使用局部变量,就像您对 it 所做的那样。 【参考方案1】:

将小部件添加到数据中不会显示小部件,它只会存储它。如果要显示小部件,请使用 setIndexWidget 方法:

for filename in filenames:
    samplespinbox = QDoubleSpinBox()
    formatdropdown = QComboBox()

    it1 = QStandardItem(filename.split("/")[-1])
    it2 = QStandardItem()
    it3 = QStandardItem()
    self.model.appendRow((it1 ,it2, it3))
    self.table.setIndexWidget(it2.index(), samplespinbox)
    self.table.setIndexWidget(it3.index(), formatdropdown)

【讨论】:

以上是关于将带有小部件和文本的行附加到 QStandardItemModel的主要内容,如果未能解决你的问题,请参考以下文章

带有刻度文本标签的 Qt 滑块小部件

如何在颤动的行之间写 OR

看不到点击意图附加信息的小部件

Flutter - 如何在图像下方使用带有图像和文本/图标的容器小部件

带有小部件和文本的 QStandardItemModel 标头

PyQt4 中理想的小部件是啥,我们可以在其中附加文本但在填充文本后无法编辑它?