2

私はサッパーゲーム用の地雷原を描く次のプログラムを書きました

# -*- 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

1 に答える 1

4

大量の間隔が表示される最初の理由は、実際には が原因ではなくQGridLayout、レイアウト オブジェクトを束ねるように制約するものが何もないためです。あなたがする必要があるのは、レイアウトにストレッチを追加してできるだけ多くのスペースを消費し、残りのアイテムを一緒に押し込むことです.

QGridLayout ではストレッチ項目を追加できますが、そのスペーサーの行/列を常に考慮する必要があるため、後でグリッドをナビゲートするのがより複雑になると思います。代わりに、グリッド レイアウトを垂直/水平レイアウトでラップし、それらにスペーサーを追加することができます。

これを行うと、行間にわずかなスペースが残っていることに気付くでしょう。どうやらこれは QGridLayout で既知のことです (この他の質問を参照してください)。ただし、ボタンのサイズと、行と列の最小サイズを調整して、正しく表示することができます。

例を次に示します (スタンドアロン - 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)

ここに画像の説明を入力

于 2012-11-27T06:46:33.237 に答える