Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QGridLayout中QPushButton之间的距离_Python_User Interface_Python 2.7_Pyqt_Pyqt4 - Fatal编程技术网

Python QGridLayout中QPushButton之间的距离

Python QGridLayout中QPushButton之间的距离,python,user-interface,python-2.7,pyqt,pyqt4,Python,User Interface,Python 2.7,Pyqt,Pyqt4,我编写了下面的程序,它为游戏“工兵”绘制了一个雷区 # -*- coding: utf-8 -*- import mainw, sys from PyQt4 import QtCore, QtGui class WindowSapper(QtGui.QMainWindow): buttons=[] def __init__(self, parent=None): QtGui.QMainWindow.__init__(self,parent) s

我编写了下面的程序,它为游戏“工兵”绘制了一个雷区

# -*- coding: utf-8 -*-
import mainw, sys
from PyQt4 import QtCore, QtGui

class WindowSapper(QtGui.QMainWindow):
    buttons=[]

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.ui=mainw.Ui_mainwin()
        self.ui.setupUi(self)
        for i in xrange(10):
            l=[]
            for j in xrange(10):
                b=QtGui.QPushButton()
                l.append(b)
                self.ui.gridLayout.addWidget(b, i, j, 1, 1)
            self.buttons.append(l)

def main():
    app=QtGui.QApplication(sys.argv)
    window=WindowSapper()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
我还应用了表单模块

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'mainw.ui'
#
# Created: Tue Nov 27 08:52:39 2012
#      by: PyQt4 UI code generator 4.9.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_mainwin(object):
    def setupUi(self, mainwin):
        mainwin.setObjectName(_fromUtf8("mainwin"))
        mainwin.resize(546, 530)
        self.centralwidget = QtGui.QWidget(mainwin)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.gridLayoutWidget = QtGui.QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 30, 521, 461))
        self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
        self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setMargin(0)
        self.gridLayout.setHorizontalSpacing(6)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        mainwin.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(mainwin)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 546, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        mainwin.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(mainwin)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        mainwin.setStatusBar(self.statusbar)

        self.retranslateUi(mainwin)
        QtCore.QMetaObject.connectSlotsByName(mainwin)

    def retranslateUi(self, mainwin):
        mainwin.setWindowTitle(QtGui.QApplication.translate("mainwin", "Сапер", None, QtGui.QApplication.UnicodeUTF8))


class mainwin(QtGui.QMainWindow, Ui_mainwin):
    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
        QtGui.QMainWindow.__init__(self, parent, f)

        self.setupUi(self)

但是它没有达到我的期望:按钮没有完全填充GridLayout,其中有空闲空间,也就是说,它们没有完全填充单元格GridLayout。如何消除这些间隙?

您看到大量间距的第一个原因实际上不是因为
QGridLayout
,而是因为没有任何东西约束布局对象使它们聚集在一起。您需要做的是在布局中添加一个拉伸,以尽可能多地占用空间,迫使其他项目推到一起

QGridLayout确实允许您向其中添加拉伸项,但我认为这会使网格在以后的导航过程中变得更加复杂,因为您必须始终考虑分隔行/列。因此,您可以将网格布局包装为垂直/水平布局,并向这些布局添加分隔符

一旦你这样做了,你会注意到两行之间还有一小部分空间。显然,这只是QGridLayout()的一个已知特性。但是,您可以使用按钮的大小以及行和列的最小大小来获得正确的结果:

下面是一个示例(独立-不需要您的UI模块)


看到大量间距的第一个原因实际上不是因为
QGridLayout
,而是因为没有任何东西约束布局对象使它们聚集在一起。您需要做的是在布局中添加一个拉伸,以尽可能多地占用空间,迫使其他项目推到一起

QGridLayout确实允许您向其中添加拉伸项,但我认为这会使网格在以后的导航过程中变得更加复杂,因为您必须始终考虑分隔行/列。因此,您可以将网格布局包装为垂直/水平布局,并向这些布局添加分隔符

一旦你这样做了,你会注意到两行之间还有一小部分空间。显然,这只是QGridLayout()的一个已知特性。但是,您可以使用按钮的大小以及行和列的最小大小来获得正确的结果:

下面是一个示例(独立-不需要您的UI模块)


你能给我解释一下为什么我们使用
l.append(b)
self.buttons.append(l)
以及它是如何工作的吗。谢谢。@utkarsh13,如果你看一下原始问题,他们使用列表来存储对按钮的引用。
self.buttons
列表包含每行按钮的列表。我不是在假设为什么要使用它们,只是我需要保留问题的原意。你能解释一下为什么要使用
l.append(b)
self.buttons.append(l)
,以及它是如何工作的吗。谢谢。@utkarsh13,如果你看一下原始问题,他们使用列表来存储对按钮的引用。
self.buttons
列表包含每行按钮的列表。我不是在假设为什么要使用它们,只是我需要保留问题的原意。
class WindowSapper(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.resize(450,350)
        self.centralwidget = QtGui.QWidget()
        self.setCentralWidget(self.centralwidget)

        self.vLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.hLayout = QtGui.QHBoxLayout()

        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setSpacing(0)

        # center the grid with stretch on both sides
        self.hLayout.addStretch(1)
        self.hLayout.addLayout(self.gridLayout)
        self.hLayout.addStretch(1)

        self.vLayout.addLayout(self.hLayout)
        # push grid to the top of the window
        self.vLayout.addStretch(1)

        self.buttons = []
        for i in xrange(10):
            l=[]
            for j in xrange(10):
                b=QtGui.QPushButton()
                b.setFixedSize(40,30)
                l.append(b)
                self.gridLayout.addWidget(b, i, j)
                self.gridLayout.setColumnMinimumWidth(j, 40)
            self.buttons.append(l)
            self.gridLayout.setRowMinimumHeight(i, 26)