从 PyQt5 中的 QTableWidget 中删除单元格填充
Remove cell padding from QTableWidget in PyQt5
我正在尝试将 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)
我想要的:
我得到的:
您必须通过委托来实现自定义绘画,另外最好设置一个默认大小覆盖委托的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_())
我正在尝试将 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)
我想要的:
我得到的:
您必须通过委托来实现自定义绘画,另外最好设置一个默认大小覆盖委托的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_())