如何消除QBoxLayout(TopToBottom)中组件间的间距
QBoxLayout消除组件间距无效的解决办法
我用PyQt5创建了一个QBoxLayout.TopToBottom方向的QBoxLayout,想完全消除组件之间的间距,但试过QBoxLayout.setSpacing(0)、QBoxLayout.setContentsMargins(0,0,0,0),甚至自定义QBoxLayout类在初始化时设置这两个属性,都没解决问题。下方组件是QProgressBar。
附上代码
自定义布局类代码:
class LearnLeftPanelQBox(QBoxLayout): def __init__(self): super().__init__(QBoxLayout.TopToBottom) self.setContentsMargins(0,0,0,0) self.setSpacing(0) self.learnLeftPanelTitle=QLabel("Correct:") self.learnLeftPanelTopLayout.addWidget(self.learnLeftPanelTitle) self.learnLeftPanelTitle.setStyleSheet("font: 20pt Comic Sans MS; color: white;") self.learnLeftPanelTopLayout.addWidget(self.learnLeftPanelTitle) self.learnLeftPanelProgressCorrect=QProgressBar() self.learnLeftPanelProgressCorrect.setStyleSheet("font: 20pt Comic Sans MS; color: green;") self.learnLeftPanelTopLayout.addWidget(self.learnLeftPanelProgressCorrect) self.learnLeftPanelTitle=QLabel("Incorrect:") self.learnLeftPanelTopLayout.addWidget(self.learnLeftPanelTitle) self.learnLeftPanelTitle.setStyleSheet("font: 20pt Comic Sans MS; color: white;") self.learnLeftPanelProgressIncorrect=QProgressBar() self.learnLeftPanelProgressIncorrect.setStyleSheet("font: 20pt Comic Sans MS; color: red;") self.learnLeftPanelTopLayout.addWidget(self.learnLeftPanelProgressIncorrect) self.learnLeftPanelLayout.addWidget(self.learnLeftPanelTop) self.learnLeftPanelSettingsButton=QPushButton("Settings") self.learnLeftPanelSettingsButton.setStyleSheet("QPushButton{font: 20pt Comic Sans MS; color: white;border-style: outset; border-width: 2px; border-radius: 10px;border-color:white;} QPushButton::hover{background-color: white; color: black;}") self.learnLeftPanelSettingsButton.clicked.connect(self._showLearnSettings) self.learnLeftPanelLayout.addWidget(self.learnLeftPanelSettingsButton)
注:代码缩进格式存在问题,但不影响逻辑,代码位于独立函数中,其余部分无关。
可复现代码:
# Purpose: Stack layout example from PyQt5.QtWidgets import QWidget, QLabel,QProgressBar,QApplication,QBoxLayout class main(QWidget): def __init__(self) -> None: super().__init__() self.showFullScreen() layout=QBoxLayout(QBoxLayout.TopToBottom) layout.setContentsMargins(0,0,0,0) firstLabel=QLabel("First Label") firstBar=QProgressBar() secondLabel=QLabel("Second Label") secondBar=QProgressBar() layout.addWidget(firstLabel) layout.addWidget(firstBar) layout.addWidget(secondLabel) layout.addWidget(secondBar) self.setLayout(layout) if __name__=="__main__": import sys app = QApplication(sys.argv) win = main() win.show() sys.exit(app.exec_())
解决办法
问题不在布局本身,而是QLabel和QProgressBar组件自身带有默认的边距(margin)和内边距(padding),导致看起来有间距。需要给这些组件设置样式表,强制清除边距和内边距:
- 给QLabel添加样式:
margin:0; padding:0; - 给QProgressBar添加样式:
margin:0; padding:0;,同时可以调整其内容区域的边距(如果需要)。
修改后的可复现代码示例:
# Purpose: Stack layout example from PyQt5.QtWidgets import QWidget, QLabel,QProgressBar,QApplication,QBoxLayout class main(QWidget): def __init__(self) -> None: super().__init__() self.showFullScreen() layout=QBoxLayout(QBoxLayout.TopToBottom) layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) # 补充设置spacing为0 firstLabel=QLabel("First Label") firstLabel.setStyleSheet("margin:0; padding:0;") # 清除标签边距 firstBar=QProgressBar() firstBar.setStyleSheet("margin:0; padding:0;") # 清除进度条边距 secondLabel=QLabel("Second Label") secondLabel.setStyleSheet("margin:0; padding:0;") secondBar=QProgressBar() secondBar.setStyleSheet("margin:0; padding:0;") layout.addWidget(firstLabel) layout.addWidget(firstBar) layout.addWidget(secondLabel) layout.addWidget(secondBar) self.setLayout(layout) if __name__=="__main__": import sys app = QApplication(sys.argv) win = main() win.show() sys.exit(app.exec_())
另外,如果你使用了自定义样式,需要把margin:0; padding:0;合并到已有的样式表中,比如你的自定义代码里的QLabel样式可以改成:
font: 20pt Comic Sans MS; color: white; margin:0; padding:0;
这样就能完全消除组件之间的额外间距了。
内容的提问来源于stack exchange,提问作者user19926715
相关产品推荐
相关产品推荐

