PyQt:Widget和PushButtons

时间:2016-11-14 23:30:22

标签: python pyqt4

使用PyQt,我想创建一个用户界面来回答这组规则:

  • 该板由尺寸为(s,s)的二维网格组成,其中s为奇整数
  • 此网格的每个小部件都是QtPushButton
  • 当我们初始化UI时,每个按钮都被禁用,除了中间的按钮(位置((s-1)// 2,(s-1)// 2)
  • 每次单击启用的按钮时,都会禁用该按钮并启用其所有邻居。例如,在开始时,我必须单击((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 个答案:

答案 0 :(得分:2)

假设neighbours符合您的要求(您还没有包含该代码),您希望在QWidgetItem的小部件上调用setEnabled()

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