python - 如何让 QGridLayout 上放置的标签更加一致?
问题描述
我正在制作简单的程序,它从数据库中读取一些数据并将其显示在窗口中。我决定使用 PyQt5 中的 QGridLayout,但不能解决放置在该布局上的标签宽度不一致的问题。下面是带有随机文本而不是数据库数据的精简版本。我想总是将一些标签拉伸到正确的位置,但有时(取决于文本)它们只占用了为它们设计的部分空间。我做错了什么?示例: “刷新”按钮将文本更改为不同的随机文本并更改布局。代码:
import random
import string
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp, QApplication, QGridLayout, QLabel, QMainWindow, QPushButton, QWidget
class GardenHelperUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Garden Helper')
self.setFixedSize(800, 600)
self.generalLayout = QGridLayout()
self.bt_refresh = QPushButton('Refresh')
self._centralWidget = QWidget(self)
self.setCentralWidget(self._centralWidget)
self._centralWidget.setLayout(self.generalLayout)
self.status_bar = self.statusBar()
self.status_bar.showMessage('Ready')
self.tool_bar()
self.toolbar.addWidget(self.bt_refresh)
self.display_record()
def tool_bar(self):
exitAct = QAction(QIcon('img\exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Tools')
self.toolbar.addAction(exitAct)
self.bt_refresh.clicked.connect(self.display_record)
def display_record(self):
pl_namex = random_text(15)
en_namex = random_text(15)
lat_namex = random_text(15)
descx = random_text(200)
seedx = random_text(200)
watx = random_text(200)
likesx = random_text(200)
maintx = random_text(200)
self.clear_layout(self.generalLayout)
self.create_label(pl_namex, 1, 1, 2, 2, 3)
self.create_label(en_namex, 1, 4, 2, 2, 3)
self.create_label(lat_namex, 1, 7, 2, 2, 3)
self.create_label('Description:', 3, 1, 1, 2, 2)
self.create_label(descx, 3, 3, 2, 9)
self.create_label('Likes', 5, 1, 1, 2, 2)
self.create_label(likesx, 5, 3, 2, 9)
self.create_label('Seeding:', 7, 1, 1, 2, 2)
self.create_label(seedx, 7, 3, 2, 9)
self.create_label('Watering:', 9, 1, 1, 2, 2)
self.create_label(watx, 9, 3, 2, 9)
self.create_label('Maintenance:', 11, 1, 1, 2, 2)
self.create_label(maintx, 11, 3, 2, 9)
def create_label(self, label_text, pos_x: int, pos_y: int, rspan: int = 1, cspan: int = 1,
stylex: int = 1,
align=Qt.AlignLeft | Qt.AlignTop):
new_label = QLabel(label_text)
if stylex == 1:
new_label.setStyleSheet('font: 11pt Roboto Light; color: black; background-color: #E7ECB1; border-style: '
'solid; border-width: 1px; border-color: black')
elif stylex == 2:
new_label.setStyleSheet('font: 11pt Roboto Condensed; color: black')
elif stylex == 3:
new_label.setStyleSheet('font: 11pt Roboto Light Italic; color: #007E1F; background-color: #E2E2E2; '
'border-style: '
'solid; border-width: 0.5px; border-color: #969890')
new_label.setWordWrap(True)
self.generalLayout.addWidget(new_label, pos_x, pos_y, rspan, cspan, align)
def clear_layout(self, layout):
while layout.count() > 0:
item = layout.takeAt(0)
if not item:
continue
w = item.widget()
if w:
w.deleteLater()
def random_text(length):
text_list = []
letters = list(string.ascii_letters + string.digits + ' ' * 10)
for i in range(length):
text_list.append(letters[random.randint(0, len(letters) - 1)])
text_str = ''.join(text_list)
# print(text_str)
return text_str
def main():
garden_helper = QApplication(sys.argv)
window = GardenHelperUI()
window.show()
sys.exit(garden_helper.exec_())
if __name__ == '__main__':
main()
解决方案
对不起,但我不明白为什么总是要改革
new_label = QLabel (label_text)
以及为什么需要该 clear_layout
方法
试试看:
主文件
import sys
import random
import string
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, qApp, QApplication, QGridLayout, QLabel, \
QMainWindow, QPushButton, QWidget
baseUIClass, baseUIWidget = uic.loadUiType("garden_helper.ui")
class GardenHelperUI(QMainWindow, baseUIClass):
def __init__(self):
super().__init__()
self.setupUi(self)
self.setWindowTitle('Garden Helper')
# self.setFixedSize(800, 600)
self.bt_refresh = QPushButton('Refresh')
self.status_bar = self.statusBar()
self.status_bar.showMessage('Ready')
self.tool_bar()
self.toolbar.addWidget(self.bt_refresh)
self._dictLabel = {
'pl_namex': random_text(15),
'en_namex': random_text(15),
'lat_namex': random_text(15),
'descx': random_text(200),
'seedx': random_text(200),
'watx': random_text(200),
'likesx': random_text(200),
'maintx': random_text(200),
}
self.stylex()
self.display_record()
def tool_bar(self):
exitAct = QAction(QIcon('img\exit.png'), 'Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Tools')
self.toolbar.addAction(exitAct)
self.bt_refresh.clicked.connect(self.refresh_record) # refresh_record
def stylex(self):
self.setStyleSheet('''
#descx, #seedx, #watx, #likesx, #maintx {
font: 11pt Roboto Light;
color: black;
background-color: #FFECB1;
border-style: solid;
border-width: 1px;
border-color: black;
}
#description, #likes, #seeding, #watering, #maintenance {
font: 11pt Roboto Condensed;
color: black;
}
#pl_namex, #en_namex, #lat_namex {
font: 11pt Roboto Light Italic;
color: #007E1F;
background-color: #E2E2E2;
border-style: solid;
border-width: 0.5px;
border-color: #969890;
max-width: 150px;
min-width: 150px;
max-height: 30px;
}
''')
def display_record(self):
self.pl_namex.setText(self._dictLabel['pl_namex'])
self.en_namex.setText(self._dictLabel['en_namex'])
self.lat_namex.setText(self._dictLabel['lat_namex'])
self.descx.setText(self._dictLabel['descx'])
self.seedx.setText(self._dictLabel['seedx'])
self.watx.setText(self._dictLabel['watx'])
self.likesx.setText(self._dictLabel['likesx'])
self.maintx.setText(self._dictLabel['maintx'])
def refresh_record(self):
self._dictLabel['pl_namex'] = random_text(15)
self._dictLabel['en_namex'] = random_text(15)
self._dictLabel['lat_namex'] = random_text(15)
self._dictLabel['descx'] = random_text(200)
self._dictLabel['seedx'] = random_text(200)
self._dictLabel['watx'] = random_text(200)
self._dictLabel['likesx'] = random_text(200)
self._dictLabel['maintx'] = random_text(200)
self.display_record()
def random_text(length):
text_list = []
letters = list(string.ascii_letters + string.digits + ' ' * 10)
for i in range(length):
text_list.append(letters[random.randint(0, len(letters) - 1)])
text_str = ''.join(text_list)
return text_str
if __name__ == '__main__':
garden_helper = QApplication(sys.argv)
window = GardenHelperUI()
window.show()
sys.exit(garden_helper.exec_())
garden_helper.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>750</width>
<height>594</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="6">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<widget class="QLabel" name="waterin">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Watering:</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="6">
<widget class="QLabel" name="maintx">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLabel" name="pl_namex">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLabel" name="lat_namex">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<widget class="QLabel" name="likes">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Likes:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="en_namex">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="1" colspan="6">
<widget class="QLabel" name="likesx">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="2" column="1" colspan="6">
<widget class="QLabel" name="seedx">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="description">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="text">
<string>Description:</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="maintenance">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Maintenance:</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="6">
<widget class="QLabel" name="descx">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="3" column="1" colspan="6">
<widget class="QLabel" name="watx">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="seeding">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Seeding:</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>