从 PyQt5 中的 QTableWidget 中删除单元格填充

Posted

技术标签:

【中文标题】从 PyQt5 中的 QTableWidget 中删除单元格填充【英文标题】:Remove cell padding from QTableWidget in PyQt5 【发布时间】:2020-09-01 02:33:56 【问题描述】:

我正在尝试将 QTableWidget 与 PyQt5 和 QtDesigner 结合使用,以在 GUI 的网格中显示图像。 (我正在模拟 LED 面板显示器。)我希望每个图像都可以独立于其他图像进行更改,并且在空间上与网格中的相邻图像相切。我遇到的问题是我找不到删除单元格填充的方法,以便我可以使图像看起来形成连续的马赛克。有谁知道是否有办法做到这一点?

编辑:这里有更多信息:

class Home_Win(QMainWindow):
    def __init__(self):
        # Show GUI------------------------
        QMainWindow.__init__(self)
        self.ui = loadUi("bugpanel.ui", self)
        blueLED = QTableWidgetItem(QIcon("img/blueLED.jpg"),'',0)
        rows, cols = 16,32
        for row in range(rows):
            for col in range(cols):
                self.tableWidget_2.setItem(0 , 0, QTableWidgetItem(QIcon("img/greenLED.jpg"),'',0))
        self.tableWidget_2.setItem(0 , 1, blueLED)

我想要什么:

我得到了什么:

【问题讨论】:

你可以展示你现在得到的图像,以及你想要得到的另一个图像。它还提供了一个minimal reproducible example 谢谢!感谢您的建议并添加了更多信息。 【参考方案1】:

您必须通过委托实现自定义绘画,最好设置默认大小覆盖委托的 sizeHint() 方法并调用 resizeRowsToContents() 和 resizeColumnsToContents() 方法:

import random

from PyQt5 import QtCore, QtGui, QtWidgets


class IconDelegate(QtWidgets.QStyledItemDelegate):
    def paint(self, painter, option, index):
        icon = index.data(QtCore.Qt.DecorationRole)
        mode = QtGui.QIcon.Normal
        if not (option.state & QtWidgets.QStyle.State_Enabled):
            mode = QtGui.QIcon.Disabled
        elif option.state & QtWidgets.QStyle.State_Selected:
            mode = QtGui.QIcon.Selected
        state = (
            QtGui.QIcon.On
            if option.state & QtWidgets.QStyle.State_Open
            else QtGui.QIcon.Off
        )
        pixmap = icon.pixmap(option.rect.size(), mode, state)
        painter.drawPixmap(option.rect, pixmap)

    def sizeHint(self, option, index):
        return QtCore.QSize(60, 60)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        table = QtWidgets.QTableWidget(10, 10)
        delegate = IconDelegate(table)
        table.setItemDelegate(delegate)

        self.setCentralWidget(table)

        for i in range(table.rowCount()):
            for j in range(table.columnCount()):

                # create icon
                pixmap = QtGui.QPixmap(100, 100)
                color = QtGui.QColor(*random.sample(range(255), 3))
                pixmap.fill(color)
                icon = QtGui.QIcon(pixmap)

                it = QtWidgets.QTableWidgetItem()
                it.setIcon(icon)
                table.setItem(i, j, it)

        table.resizeRowsToContents()
        table.resizeColumnsToContents()


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

通过使用deligate功能,是否仍然可以在选中时更改单元格项的背景颜色?我已经尝试过了,但它不起作用,因为委托样式已经用这个示例覆盖了表格单元格的背景颜色,并带有一个带有导入图像的自定义图标

以上是关于从 PyQt5 中的 QTableWidget 中删除单元格填充的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 - 从 sqlite3 复制到 QTableWidget 的 SQL 行不显示

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中? (QComboBox 有复选框来选择项目)

PyQt5-高级控件使用(QTableWidget)

PyQt5 - 使 QTableWidget 中的整数和日期可正确排序

得到选择行pyqt5 qtablewidget

Qtablewidget 去除黑色空间 PyQt5