使用Python 2.7.3和Qt Designer 4.8.2:我是Qt新手,如何创建一个可单击以生成地图的简单网格区域?下图说明了我的意图。
本质上我的主要问题是网格区域,我在 Qt 中看不到任何类似“现成的”的东西。
最接近的等价物似乎是QTableWidget。
下面是一个基本演示,应该可以让您朝着正确的方向开始:
from PyQt5 import QtWidgets, QtCore
# from PyQt6 import QtWidgets, QtCore
class Window(QtWidgets.QWidget):
def __init__(self, rows, columns):
super().__init__()
self.table = QtWidgets.QTableWidget(rows, columns + 1, self)
self.table.setSelectionMode(
QtWidgets.QAbstractItemView.SelectionMode.NoSelection)
self.table.setEditTriggers(
QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
self.table.verticalHeader().setDefaultSectionSize(30)
self.table.verticalHeader().setHidden(True)
self.table.horizontalHeader().setDefaultSectionSize(30)
self.table.horizontalHeader().setHidden(True)
self.table.setColumnWidth(columns, 50)
margin = self.table.palette().window().color()
for row in range(rows):
for column in range(columns + 1):
item = QtWidgets.QTableWidgetItem()
if column < columns:
item.setBackground(QtCore.Qt.GlobalColor.white)
else:
item.setBackground(margin)
item.setTextAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
item.setText('0x00')
self.table.setItem(row, column, item)
self.table.itemPressed.connect(self.handleItemPressed)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.table)
def handleItemPressed(self, item):
columns = self.table.columnCount() - 1
if item.column() < columns:
margin = self.table.item(item.row(), columns)
value = 1 << (7 - item.column())
result = int(margin.text(), 16)
if item.background().color() == QtCore.Qt.GlobalColor.black:
item.setBackground(QtCore.Qt.GlobalColor.white)
result &= ~value
else:
item.setBackground(QtCore.Qt.GlobalColor.black)
result |= value
margin.setText(f'0x{result:02X}')
if __name__ == '__main__':
app = QtWidgets.QApplication(['Test'])
window = Window(4, 8)
window.resize(350, 175)
window.show()
app.exec()
一个(笨重?)解决方案是使用带有像素图集的标签小部件来绘制地图图像。您可以通过监听该小部件上的
mousePressEvent
来实现可点击性,在该小部件上您可以获得包含鼠标 x、y 位置(全局位置和相对于单击的小部件)的 QMouseEvent
对象。然后可以使用它来确定单击图像上的位置。