Qt Designer - 可点击区域生成地图

问题描述 投票:0回答:2

使用Python 2.7.3和Qt Designer 4.8.2:我是Qt新手,如何创建一个可单击以生成地图的简单网格区域?下图说明了我的意图。

本质上我的主要问题是网格区域,我在 Qt 中看不到任何类似“现成的”的东西。

enter image description here

python qt pyqt grid qtablewidget
2个回答
2
投票

最接近的等价物似乎是QTableWidget

下面是一个基本演示,应该可以让您朝着正确的方向开始:

screenshot

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()

1
投票

一个(笨重?)解决方案是使用带有像素图集的标签小部件来绘制地图图像。您可以通过监听该小部件上的

mousePressEvent
来实现可点击性,在该小部件上您可以获得包含鼠标 x、y 位置(全局位置和相对于单击的小部件)的
QMouseEvent
对象。然后可以使用它来确定单击图像上的位置。

© www.soinside.com 2019 - 2024. All rights reserved.