qt - Qt:QPushButton 垂直大小,适合内容吗?
问题描述
有什么方法可以可靠地使按钮的高度适合其内容?以前的一些答案建议使用布局和大小策略,或最大高度(如何使 QPushButton 的高度自动适合文本?,在 PyQT 中增加 QPushButton 的高度,如何将 QPushButton 设置为垂直增长?),但他们没有t 似乎对我有用。
请参见下面的示例。这两个按钮是用它们默认的“一行”高度绘制的,所以里面的文本被剪掉了。将他们的大小政策设置为Preferred
或Minimum
不改变任何东西。使用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_() )
解决方案
问题是按钮通常没有布局,并根据以下内容返回大小提示:
- 内容(如果存在)(图标和/或文本)
- 当前样式的度量(按钮斜角、焦点矩形和按钮边距)基于内容,从返回
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()
推荐阅读
- node.js - Adonis 会话不会在测试之间持续存在
- google-apps-script - Gmail message.getFrom() 提供别名发件人而不是发送邮件的人
- c# - ASP.NET CORE 存储过程错误:InvalidCastException
- javascript - 无法使用 JavaScript 以编程方式发送电子邮件
- javascript - Javascript设置运行时区
- django - 如何将聊天服务的访问权限仅限于已注册的网站
- javascript - 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行
- mysql - 在 MySQL 8 中永久更改 sql_require_primary_key 值
- javascript - 我如何创建一个可以显示我在设计中并排填写的内容的实时表单?
- powerbi - 导出可用于进一步编辑的 Power BI 报表的方法