2009-01-02 184 views
9

我很難在調整對話框大小時自動調整大小的QDialog中的小部件。PyQt:獲取小部件在QDialog中自動調整大小

在以下程序中,如果調整主窗口的大小,textarea會自動調整大小。但是,對話框調整大小時,對話框中的textarea保持不變。

是否有任何方法讓對話框中的textarea自動調整大小?我已經嘗試在對話框本身和內部的兩個小部件上使用setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored),但這似乎沒有效果。

我在openSuSE 10.2上使用Qt版本3.3.7和PyQt版本3.5.5-29,如果這是相關的。

import sys 
from qt import * 

# The numbers 1 to 1000 as a string. 
NUMBERS = ("%d " * 1000) % (tuple(range(1,1001))) 

# Add a textarea containing the numbers 1 to 1000 to the given 
# QWidget. 
def addTextArea(parent, size): 
    textbox = QTextEdit(parent) 
    textbox.setReadOnly(True) 
    textbox.setMinimumSize(QSize(size, size*0.75)) 
    textbox.setText(NUMBERS) 


class TestDialog(QDialog): 
    def __init__(self,parent=None): 
     QDialog.__init__(self,parent) 
     self.setCaption("Dialog") 
     everything = QVBox(self) 

     addTextArea(everything, 400) 
     everything.resize(everything.sizeHint()) 


class TestMainWindow(QMainWindow): 
    def __init__(self,parent=None): 
     QMainWindow.__init__(self,parent) 
     self.setCaption("Main Window") 
     everything = QVBox(self) 

     addTextArea(everything, 800) 

     button = QPushButton("Open dialog", everything) 
     self.connect(button, SIGNAL('clicked()'), self.openDialog)   

     self.setCentralWidget(everything) 
     self.resize(self.sizeHint()) 

     self.dialog = TestDialog(self) 

    def openDialog(self): 
     self.dialog.show() 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    mainwin = TestMainWindow(None) 
    app.setMainWidget(mainwin) 
    mainwin.show() 
    app.exec_loop() 

回答

4

QMainWindow對於QDialog沒有的中心控件有特殊的行爲。要達到所需的行爲,您需要創建layout,將文本區域添加到佈局並將佈局分配給對話框。

2

我曾經看過使用QLayout但沒有運氣。我試圖做類似

dialog.setLayout(some_layout) 

但我無法得到這樣的工作方式,所以我放棄了。

我的錯誤是我試圖將佈局傳遞給對話框,當我應該將對話框傳遞給佈局時。

添加線

layout = QVBoxLayout(self) 
layout.add(everything) 

到的TestDialog.__init__修復問題的結束。

感謝Monjardin提醒我重新考慮佈局。

2

我想補充一點關於此的註解 - 我想有從一個應用程序,這是一個QDialog催生了一個子窗口,其中包含一個QTextEdit作爲一個孩子/內容 - 我希望QTextEdit自動調整時QDialog窗口大小發生變化。這對我來說好像已經完成了PyQt4

def showTextWindow(self): 

    #QVBox, QHBox # don't exist in Qt4 

    dialog = QDialog(self) 
    #dialog.setGeometry(QRect(100, 100, 400, 200)) 
    dialog.setWindowTitle("Title") 
    dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose) 

    textbox = QTextEdit(dialog) 
    textbox.setReadOnly(True) 
    textbox.setMinimumSize(QSize(400, 400*0.75)) 
    textbox.setText("AHAAA!") 

    # this seems enough to have the QTextEdit 
    # autoresize to window size changes of dialog! 
    layout = QHBoxLayout(dialog) 
    layout.addWidget(textbox) 
    dialog.setLayout(layout) 

    dialog.exec_()