将 QPushButton 宽度缩小到最小

Posted

技术标签:

【中文标题】将 QPushButton 宽度缩小到最小【英文标题】:Shrink a QPushButton width to the minimum 【发布时间】:2013-01-19 20:10:20 【问题描述】:

这似乎是一件很简单的事情,但我似乎无法弄清楚。如何使按钮的最小宽度。它一直扩展到我放入的布局的宽度。在以下示例中,QPushButton 的宽度最终与 QLabel 相同:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class MyWindow(QWidget):

    def __init__(self,parent = None):

        QWidget.__init__(self,parent)

        layout = QVBoxLayout()
        layout.addWidget(QLabel('this is a really, really long label that goes on and on'))
        layout.addWidget(QPushButton('short button'))

        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

setMaximumWidth 适合我

from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QtGui.QHBoxLayout()
        texts = [":)",
                 "&Short",
                 "&Longer",
                 "&Different && text",
                 "More && text",
                 "Even longer button text", ]
        for text in texts:
            btn = QtGui.QPushButton(text)
            double = text.count('&&')
            text = text.replace('&', '') + ('&' * double)
            width = btn.fontMetrics().boundingRect(text).width() + 7
            btn.setMaximumWidth(width)
            layout.addWidget(btn)
        self.setLayout(layout)

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    mainWin = Window()
    mainWin.show()
    sys.exit(app.exec_())

【讨论】:

这是一个非常不错的演示。顺便说一句,您只需执行width = btn.fontMetrics().boundingRect(re.sub('&(?=(?:&&)*[^&])', '', text)).width() + 7 即可转换文本而无需任何中间步骤。您可以只替换所有&,后面跟着偶数个& 这样做的好处是& 可以就地正确处理,而不是被添加回字符串的末尾。【参考方案2】:

请参阅http://qt-project.org/doc/qt-4.8/qwidget.html#sizePolicy-prop 和http://qt-project.org/doc/qt-4.8/qsizepolicy.html#Policy-enum,了解如何在动态布局中控制小部件的大小。

如果您仅通过更改 SizePolicy 无法获得满意的结果(您应该),您也可以看看这些好人:http://qt-project.org/doc/qt-4.8/qspaceritem.html

【讨论】:

IIRC QPushButton 有一个固定的最小宽度(我认为是 80),试图通过策略强制它更小会导致不可预测的结果,因为这意味着策略将忽略最小宽度。跨度> 在我的应用程序中,我有一个 QPushButton,最小和最大宽度都设置为 16,显示宽度为 8 的图标。它按预期工作。但是,在 OS X 中,该按钮与所有其他按钮的 OS X Aqua 样式不同,但似乎恢复为普通按钮以实现其大小属性。所以这是一个需要考虑的副作用。

以上是关于将 QPushButton 宽度缩小到最小的主要内容,如果未能解决你的问题,请参考以下文章

Kendo Grid MVC 不能将列缩小到超出某个限制

PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目

将字段文本缩小到比提示文本更小的宽度

使 QMenu 具有与父级相同的宽度(QPushButton)

你如何计算javascript中html表格的最小宽度?

浏览器缩放,会导致布局打乱,解决方法?/一缩小网页布局就打乱了怎么办?