如何使行和列的大小与 PyQt5 中的网格布局保持一致?
How can I keep row and column size the same with the grid layout in PyQt5?
我正在尝试为国际象棋游戏创建 GUI。我正在使用网格布局,当主 window 打开时,我的标签大小正确。但是,当我调整 window 的大小时,网格布局确实会随着 window 一起移动,但它的内容不对齐,并且行和列的大小不再匹配。有没有办法使网格布局中的单元格大小始终为正方形(因此行大小 = 列大小)。
正确的比例,其中 rowsize = columnsize :
不正确的缩放示例,其中行大小不等于列大小:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setGeometry(500,150,860,860)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#Adding Grid Layout to the main widget
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.gridLayout.setHorizontalSpacing(0)
self.gridLayout.setVerticalSpacing(0)
all_position_labels = []
colour = False
for x in range(8):
row = []
for y in range(8):
#Creating the labels
self.position = QtWidgets.QLabel(self.centralwidget)
self.position.setText("Place " + str(x) + " " + str(y))
if colour == True:
self.position.setStyleSheet("border: 0.1em solid black; background: gray;")
colour = False
else:
self.position.setStyleSheet("border: 0.1em solid black;")
colour = True
#Adding labels to the GridLayout
self.gridLayout.addWidget(self.position, x, y, 1, 1)
row.append(self.position)
all_position_labels.append(row)
if colour == True:
colour = False
else:
colour = True
del row
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
谢谢。
标签的大小取决于容器的大小,因此可能的解决方案是根据 window 的大小调整小部件的大小。
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import (
QApplication,
QGridLayout,
QLabel,
QMainWindow,
QStyle,
QWidget,
)
class CentralWidget(QWidget):
def __init__(self, widget):
super().__init__()
self._widget = widget
self.widget.setParent(self)
@property
def widget(self):
return self._widget
def resizeEvent(self, event):
super().resizeEvent(event)
size = min(self.width(), self.height())
r = QStyle.alignedRect(
Qt.LeftToRight, Qt.AlignCenter, QSize(size, size), self.rect()
)
self.widget.setGeometry(r)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
container = QWidget()
central_widget = CentralWidget(container)
self.setCentralWidget(central_widget)
lay = QGridLayout(container)
lay.setSpacing(0)
lay.setContentsMargins(0, 0, 0, 0)
colour = False
for i in range(8):
for j in range(8):
label = QLabel(f"Place {i} {j}", alignment=Qt.AlignCenter)
label.setStyleSheet(
"border: 0.1em solid black;"
if colour
else "border: 0.1em solid black; background: gray;"
)
lay.addWidget(label, i, j)
colour = not colour
colour = not colour
def main():
app = QApplication([])
app.setStyle("fusion")
view = MainWindow()
view.resize(860, 860)
view.show()
app.exec_()
if __name__ == "__main__":
main()
我正在尝试为国际象棋游戏创建 GUI。我正在使用网格布局,当主 window 打开时,我的标签大小正确。但是,当我调整 window 的大小时,网格布局确实会随着 window 一起移动,但它的内容不对齐,并且行和列的大小不再匹配。有没有办法使网格布局中的单元格大小始终为正方形(因此行大小 = 列大小)。
正确的比例,其中 rowsize = columnsize :
不正确的缩放示例,其中行大小不等于列大小:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setGeometry(500,150,860,860)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#Adding Grid Layout to the main widget
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.gridLayout.setHorizontalSpacing(0)
self.gridLayout.setVerticalSpacing(0)
all_position_labels = []
colour = False
for x in range(8):
row = []
for y in range(8):
#Creating the labels
self.position = QtWidgets.QLabel(self.centralwidget)
self.position.setText("Place " + str(x) + " " + str(y))
if colour == True:
self.position.setStyleSheet("border: 0.1em solid black; background: gray;")
colour = False
else:
self.position.setStyleSheet("border: 0.1em solid black;")
colour = True
#Adding labels to the GridLayout
self.gridLayout.addWidget(self.position, x, y, 1, 1)
row.append(self.position)
all_position_labels.append(row)
if colour == True:
colour = False
else:
colour = True
del row
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
谢谢。
标签的大小取决于容器的大小,因此可能的解决方案是根据 window 的大小调整小部件的大小。
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import (
QApplication,
QGridLayout,
QLabel,
QMainWindow,
QStyle,
QWidget,
)
class CentralWidget(QWidget):
def __init__(self, widget):
super().__init__()
self._widget = widget
self.widget.setParent(self)
@property
def widget(self):
return self._widget
def resizeEvent(self, event):
super().resizeEvent(event)
size = min(self.width(), self.height())
r = QStyle.alignedRect(
Qt.LeftToRight, Qt.AlignCenter, QSize(size, size), self.rect()
)
self.widget.setGeometry(r)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
container = QWidget()
central_widget = CentralWidget(container)
self.setCentralWidget(central_widget)
lay = QGridLayout(container)
lay.setSpacing(0)
lay.setContentsMargins(0, 0, 0, 0)
colour = False
for i in range(8):
for j in range(8):
label = QLabel(f"Place {i} {j}", alignment=Qt.AlignCenter)
label.setStyleSheet(
"border: 0.1em solid black;"
if colour
else "border: 0.1em solid black; background: gray;"
)
lay.addWidget(label, i, j)
colour = not colour
colour = not colour
def main():
app = QApplication([])
app.setStyle("fusion")
view = MainWindow()
view.resize(860, 860)
view.show()
app.exec_()
if __name__ == "__main__":
main()