2016-11-14 103 views
0

使用PyQt的,我想創建,回答該組規則的用戶界面:PyQt的:窗口小部件和按鈕

  • 板是由大小(S,S)的2維網格的用這是一個奇數
  • 這個網格的每個部件都是QtPushButton
  • 當我們初始化用戶界面時,每個按鈕都是禁用的,除了中間的一個(在位置((s-1)// 2,( s-1)// 2)
  • 每當我點擊一個啓用的按鈕,它被禁用,並且它的所有鄰居都被啓用。例如,在開始ning,我必須點擊((s-1)// 2,(s-1)// 2)按鈕。然後禁用並且按鈕((s-3)// 2,(s-1)// 2),((s + 1)// 2,(s-1)// 2),((s- 1)// 2,(s-3)// 2),((s-1)// 2,(s + 1)// 2)被啓用。

我的主要問題是,我沒有找到任何Qt命令來訪問網格中預定位置的按鈕。 我發現最接近這個的是函數mouseClickEvent。 不幸的是,QtGui.QGridLayout.itemAtPosition(self.grid,* location).setEnabled(False)不起作用,因爲QtGui.QGridLayout.itemAtPosition(self.grid,* location)不是PushButton,而是QtWidget。

下面有一些僞代碼:它寫在#後面。

import sys 
import numpy as np 
from PyQt4 import QtGui 

class InterfaceGraphique(QtGui.QWidget): 

    def __init__(self,size): 
     super(InterfaceGraphique, self).__init__() 
     self.size=size 
     self.position=((size-1)//2,(size-1)//2) 
     self.initUI(size) 

    def initUI(self,size): 
     self.grid = QtGui.QGridLayout() 
     self.setLayout(self.grid) 
     names=list(map(lambda x: str(x),np.random.choice(10,size**2))) 
     positions = [(i, j) for i in range(size) for j in range(size)] 
     for position, name in zip(positions, names): 
      button = QtGui.QPushButton(name) 
      button.clicked.connect(self.mouseClickEvent) 
      self.grid.addWidget(button, *position) 
     self.move(300, 150) 
     self.setWindowTitle('Game') 
     self.show() 
    def mouseClickEvent(self): 
     button=self.sender() 
     idx = self.grid.indexOf(button) 
     location = self.grid.getItemPosition(idx) 
#  QtGui.QGridLayout.itemAtPosition(self.grid,*location).setEnabled(False) 
#  for neighbor in neighbors(location) 
    #   QtGui.QGridLayout.itemAtPosition(self.grid,*neighbor).setEnabled(True) 
     self.position=location 


size=5 
def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = InterfaceGraphique(size) 
    app.exec_() 

if __name__ == '__main__': 
    main() 

回答

1

假設neighbours你想要做什麼(你有沒有包含的代碼位),要撥打setEnabled()QWidgetItem的部件。

self.grid.itemAtPosition(*neighbour).widget().setEnabled(True)