【问题标题】:Icon does not appear in QTableWidget图标未出现在 QTableWidget 中
【发布时间】:2021-10-26 18:36:37
【问题描述】:

我正在制作一个可以保存多个项目的剪贴板。我使用QClipboard 的剪贴板可以存储文本、文件路径和图像。当您复制某些内容时,它会显示在 QTableWidget 中,但图像存在问题。我想将它们显示为QTableWidgetItem 中的小图标,所以我的代码将QImage 转换为QPixmapQIcon 并将其放在QTableWidgetItem 中;但是单元格显示为空。

我不知道问题出在哪里,但也许有人能发现它。表格中的放置由“ToTable”函数执行。

class mainUI(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi("MCInterface.ui", self)
        self.qcb = QtWidgets.QApplication.clipboard()
        self.clipboard = []
        self.qcb.dataChanged.connect(self.GetClipboard)

    def GetClipboard(self):
        spinbox = self.ui.SB_ContainerLen
        clen = spinbox.value()

        if not self.ui.TB_Pause.isChecked():
            if self.qcb.text():
                data = self.qcb.text()
            elif self.qcb.image():
                data = (self.qcb.image())
            if data not in self.clipboard and len(self.clipboard) < clen:
                if isinstance(data, str) and data.startswith("file:///") and "\n" in data:
                    data = data.splitlines()
                    for d in data:
                        if len(self.clipboard) < clen:
                            self.clipboard.append(d)
                            self.ToTable(d)
                else:
                    self.clipboard.append(data)
                    self.ToTable(data)
            print(self.clipboard)

    def addRow(self):
        row = self.ui.TW_Clipboard.rowCount()
        self.ui.TW_Clipboard.insertRow(row)
        return row

    def ToTable(self, data):
        table = self.ui.TW_Clipboard

        if isinstance(data, QImage):
            row = self.addRow()
            pixmap = QPixmap()
            pixmap.fromImage(data)
            icon = QIcon()
            icon.addPixmap(pixmap)
            xItem = QtWidgets.QTableWidgetItem()
            xItem.setIcon(icon)
            yItem = QtWidgets.QTableWidgetItem("Bild")
            table.setItem(row, 0, xItem)
            table.setItem(row, 1, yItem)
        elif isinstance(data, str) and data.startswith("file:///"):
            row = self.addRow()
            table.setItem(row, 0, QtWidgets.QTableWidgetItem(data[8:]))
            table.setItem(row, 1, QtWidgets.QTableWidgetItem("Datei"))
        else:
            row = self.addRow() 
            table.setItem(row, 0, QtWidgets.QTableWidgetItem(data))
            table.setItem(row, 1, QtWidgets.QTableWidgetItem("Text"))
        
        table.setRowHeight(row, 50)

【问题讨论】:

  • xItem.setIcon(QIcon(QPixmap.fromImage(data)))

标签: python pyqt qtablewidget qtablewidgetitem pyqt6


【解决方案1】:

fromImage() 是一个静态函数,它返回一个QPixmap。由于您只执行了函数而没有引用其结果,所以 pixmap 仍然是您使用 pixmap = QPixmap() 创建的 empty pixmap。
更改为以下内容:

    def ToTable(self, data):
        table = self.ui.TW_Clipboard

        if isinstance(data, QtGui.QImage):
            row = self.addRow()
            pixmap = QtGui.QPixmap.fromImage(data)
            # ...

请注意,如果您想跟踪复制的路径,您应该使用 mime 数据 urls() 而不是从文本转换它们:复制实际路径 复制该路径的字符串。

【讨论】:

  • 谢谢。没想到这一点,虽然这是我犯的一个常见错误。我还将尝试使用 mime 数据作为文件路径。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2021-06-30
  • 2019-07-31
  • 1970-01-01
相关资源
最近更新 更多