2012-11-27 35 views
2

的QPushButton之間的距離我寫了下面的程序,繪製雷區遊戲的工兵在QGridLayout

# -*- 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。如何擺脫這些差距?

回答

4

您看到大量間距的第一個原因實際上並不是因爲QGridLayout,而是因爲沒有限制您的佈局對象使它們聚集在一起。你需要做的是在佈局上增加一段時間,以儘可能多地佔用空間,迫使剩下的物品拼合在一起。

QGridLayout確實允許您添加伸展項目,但我認爲這會讓網格更加複雜,因爲您始終必須考慮該間距行/列。因此,您可以將網格佈局包裝爲垂直/水平佈局,併爲其添加分隔符。

一旦你這樣做,你會注意到行之間留下的微小空間。顯然這只是一個已知的事情與QGridLayout(see this other question)。但是你可以用按鈕的大小,以及行和列的最小尺寸播放得到它的權利:

下面是一個例子(獨立 - 不需要你的UI模塊)

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) 

enter image description here

+0

你能解釋一下爲什麼我們使用'l.append(b)'和'self.buttons.append(l)'它是如何工作的。謝謝。 – dazzieta

+1

@ utkarsh13,如果您查看原始問題,他們正在使用列表來存儲對按鈕的引用。 'self.buttons'列表包含每行按鈕的列表。我不假設他們爲什麼被使用,只是我需要保留問題的原意。 – jdi

+0

這清除了我的懷疑,謝謝你的回覆。 – dazzieta