2014-12-02 78 views
1

使用Python 2.7.3和Qt Designer 4.8.2:我是Qt新手,我該如何創建一個可點擊的簡單網格區域來生成地圖?下面的圖片說明了我的意圖。Qt設計器 - 生成地圖的可點擊區域

從本質上講,我的主要問題是網格區域,我無法在Qt中看到任何類似「現成」的東西。

enter image description here

+0

EMZ,沒有什麼真正的嘗試 - 這是我的觀點。我已經說過這個,即Qt中的「沒有任何東西」。也許我應該更清楚,道歉。想到的第一件事就是改變顏色的簡單按鈕,但效率不高。我也沒有在給定區域內使用鼠標點擊檢測的示例代碼:一個例子會很好,而不是簡單的嘮叨。 – 2014-12-02 10:25:27

+0

Emz,Python中的一個具體示例 - 我在我的問題中聲明瞭這一點 - 如果您無法回答一個問題,或許最好不要嘗試。 – 2014-12-02 10:38:01

回答

1

一(笨重?)解決方案是使用標籤控件與像素圖組繪製地圖圖像。您可以通過在該窗口小部件上偵聽mousePressEvent來獲得可點擊的功能,通過該窗口您可以獲得包含鼠標x,y位置(全局和相對於所單擊的窗口小部件)的對象QMouseEvent。這可以用來確定圖像上的哪個地方被點擊。

1

最接近的等價物似乎是QTableWidget

這裏是粗演示,應該給你在正確的方向開始:

from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self, rows, columns): 
     QtGui.QWidget.__init__(self) 
     self.table = QtGui.QTableWidget(rows, columns, self) 
     self.table.setSelectionMode(QtGui.QAbstractItemView.NoSelection) 
     self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) 
     header = self.table.horizontalHeader() 
     header.setResizeMode(QtGui.QHeaderView.Fixed) 
     header.setDefaultSectionSize(25) 
     header.hide() 
     header = self.table.verticalHeader() 
     header.setResizeMode(QtGui.QHeaderView.Fixed) 
     header.setDefaultSectionSize(25) 
     for row in range(rows): 
      item = QtGui.QTableWidgetItem('0x00') 
      self.table.setVerticalHeaderItem(row, item) 
      for column in range(columns): 
       item = QtGui.QTableWidgetItem() 
       item.setBackground(QtCore.Qt.white) 
       self.table.setItem(row, column, item) 
     self.table.itemPressed.connect(self.handleItemPressed) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.table) 

    def handleItemPressed(self, item): 
     if item.background().color() == QtCore.Qt.black: 
      item.setBackground(QtCore.Qt.white) 
     else: 
      item.setBackground(QtCore.Qt.black) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window(4, 8) 
    window.resize(300, 150) 
    window.show() 
    sys.exit(app.exec_())