Qt:QPushButton 垂直大小,适合内容吗?

Posted

技术标签:

【中文标题】Qt:QPushButton 垂直大小,适合内容吗?【英文标题】:Qt: QPushButton vertical size, fit to contents? 【发布时间】:2020-05-03 08:27:07 【问题描述】:

有什么方法可以可靠地让按钮的高度适合其内容?以前的一些答案建议使用布局和大小策略,或最大高度(How to make height of a QPushButton automatically fit the text?、Increase Height of QPushButton in PyQT、How can I set a QPushButton to grow vertically?),但它们似乎对我不起作用。

请参见下面的示例。这两个按钮是用它们默认的“一行”高度绘制的,所以里面的文本被剪掉了。将它们的大小策略设置为PreferredMinimum 不会改变任何东西。使用 addStretch 而不是 setAlignment 不会改变任何东西(使用 none 会使按钮拉伸以填充窗口,这不是我想要的)。更改最小高度是可行的,但这远非实际,除非有某种方法可以自动计算和设置它。

#!/usr/bin/env python3

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QSize    


class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        button1 = QPushButton()
        l = QVBoxLayout()
        l.addWidget(QLabel('One'))
        l.addWidget(QLabel('Description of button one'))
        button1.setLayout(l)
        #button1.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        #button1.setMinimumHeight(50)

        button2 = QPushButton()
        l = QVBoxLayout()
        l.addWidget(QLabel('Two'))
        l.addWidget(QLabel('Description of button two\nwith extra line'))
        button2.setLayout(l)
        #button2.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        #button2.setMinimumHeight(65)

        layout = QVBoxLayout()
        layout.addWidget(button1)
        layout.addWidget(button2)
        #layout.addStretch(1)
        layout.setAlignment(QtCore.Qt.AlignTop)

        centralWidget = QWidget(self)          
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)   

        self.resize(200, 400)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = HelloWindow()
    mainWin.show()
    sys.exit( app.exec_() )

【问题讨论】:

【参考方案1】:

问题是按钮通常没有布局,并根据以下内容返回大小提示:

内容(如果存在)(图标和/或文本) 当前样式的metrics基于内容,从QStyle.sizeFromContents()返回

在您的情况下,最简单的解决方案是简单地为按钮文本使用换行符(例如:'One\nDescription of button one'),但如果您想添加一个不是标签的小部件(或想要对标签本身的更多控制),您必须覆盖 sizeHint:

class ResizableButton(QtWidgets.QPushButton):
    def sizeHint(self):
        if self.layout():
            # the button now has a layout, return its size hint
            return self.layout().sizeHint()
        # no layout set, return the result of the default implementation
        return super().sizeHint()

【讨论】:

以上是关于Qt:QPushButton 垂直大小,适合内容吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt—QPushButton 使用总结

Qt - 获取 QPushButton 图标名称

pyqt pyside QPushButton 图标(icon)大小自适应设置

Qt - 如何使 QTextBrowser 调整为内容(垂直布局)

Qt python如何知道QPushButton发送了哪些信号?

QT学习——按钮相关接口,对象树概念