首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt :小部件和PushButtons

PyQt :小部件和PushButtons
EN

Stack Overflow用户
提问于 2016-11-14 23:30:22
回答 1查看 613关注 0票数 1

使用PyQt,我想创建一个用户界面,它响应于这组规则:

  • 该板由一个大小为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。

下面有一些伪代码:它是在a #之后写的。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2016-11-14 23:41:34

假设neighbours做了您想做的事情(您还没有包含这段代码),那么您需要在QWidgetItem的小部件上调用setEnabled()

代码语言:javascript
复制
self.grid.itemAtPosition(*neighbour).widget().setEnabled(True)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40599594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档