2011-05-17 89 views
0

我有一個類似QPushButtons的網格視圖。按鈕內容不是靜態的,所以列大小會動態擴展。出於美學原因,我希望每個色譜柱具有相同的色譜柱大小。連接QPushButton的大小

現在我在顯示小部件之後使用adjust_sizes函數,因爲我注意到如果在顯示小部件之前調用它,沒有任何更改。但我的解決方案對我來說似乎很難看。有更好的方法嗎?

我的功能:

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的回答):

所需的外觀:

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

這裏是我所得到的:

enter image description here

我的系統:

Arch Linux的x86_64的,Python的3.2或2.7.1,4.8.4 PyQt的,QT 4.7.3

+0

你正在使用什麼佈局類? – Mat 2011-05-17 17:20:26

+0

@Mat,QGridLayout。 – utdemir 2011-05-17 17:22:58

+0

對不起,我認爲有人總是有所有的列寬度相同,但事實並非如此。你可以通過設置網格的'setColumnMinimumWidth'而不是每個按鈕來使你的代碼更好一點,但這並沒有什麼收穫。 – Mat 2011-05-17 18:02:21

回答

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() 

這裏是產生對話的截圖:

enter image description here

希望這類似於你正在嘗試做的。

+0

是的,這是我想要做的,但是當我在我的系統上運行您的示例代碼時,其結果爲:http://tiny.cc/s9b1a。 我的系統: Arch Linux的x86_64的, 的Python 3.2或2.7.1, PyQt的4.8.4, 的Qt 4.7.3, 使用氧氣部件集。 – utdemir 2011-05-18 18:12:15

+0

啊。我使用的是Windows,所以這必然是我們平臺上Qt之間的一個根本區別。我想你可能沒有其他選擇來確定最大按鈕寬度,然後將所有水平按鈕尺寸或列寬設置爲該值。對不起,我忍不住。 – Raceyman 2011-05-18 19:38:57