连接QPushButton的大小

0 投票
1 回答
1177 浏览
提问于 2025-04-16 17:49

我有一个像网格一样的视图,里面放了很多 QPushButton 按钮。这些按钮的内容不是固定的,所以每一列的大小会动态变化。我希望每一列的大小都一样,这样看起来更美观。

现在我在显示这个组件之后使用了一个调整大小的函数,因为我发现如果在显示之前调用这个函数,什么都不会改变。不过我觉得我的解决方案看起来不太好。有没有更好的方法呢?

我的函数:

def adjust_sizes(self):
    max_width=0
    for i in self.buttons:
        if i.geometry().width() > max_width : 
            max_width=i.geometry().width()
    for i in self.buttons: i.setMinimumSize(max_width,0)

这是我使用它的方式:

g=launcher()
g.show()
g.adjust_sizes()

有没有更好的方法来实现这个呢?

编辑:为了更清楚,这里是我想要的效果截图(看看 Raceyman 的回答):

想要的效果:

https://i.stack.imgur.com/aJ9wO.png

这是我得到的效果:

enter image description here

我的系统:

Arch Linux x86_64,Python 3.2 或 2.7.1,PyQt 4.8.4,Qt 4.7.3

1 个回答

1

抱歉如果这不是一个真正的答案(因为有点长,不太适合评论),但我在想你使用的PyQt版本可能是问题的一部分。我用的是4.8.3(我记得没错的话),当我用QGridLayout这样构建对话框时,默认情况下,所有的列都是相同的大小。下面是一个(非常非常非常粗糙的)例子:

from PyQt4 import QtGui, QtCore
import sys

class launcher(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        mainlayout = QtGui.QGridLayout()
        buttons = [['a', 'aaaa', 'aaaaaaa', 'a'], 
                   ['b', 'bbbbbbbbbb', 'bbbbb', 'b'], 
                   ['c','c','c', 'c']]
        for i, buttonrow in enumerate(buttons):
            for j, button in enumerate(buttonrow):                
                mainlayout.addWidget(QtGui.QPushButton(button), i, j)
        self.setLayout(mainlayout)
        self.exec_()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    g = launcher()
    g.show()

这是生成的对话框的截图:

在这里输入图片描述

希望这和你想做的类似。

撰写回答