2009-01-02 27 views
9

Tôi đang gặp khó khăn khi nhận tiện ích con trong QDialog được tự động thay đổi kích cỡ khi hộp thoại được thay đổi kích thước.PyQt: nhận tiện ích để tự động thay đổi kích thước trong QDialog

Trong chương trình sau, văn bản tự động thay đổi kích thước nếu bạn thay đổi kích thước cửa sổ chính. Tuy nhiên, vùng văn bản trong hộp thoại vẫn có cùng kích thước khi hộp thoại được thay đổi kích thước.

Có cách nào làm cho vùng văn bản trong hộp thoại thay đổi kích thước tự động không? Tôi đã thử sử dụng setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) trên hộp thoại chính nó và hai vật dụng bên trong, nhưng điều đó dường như không có hiệu lực.

Tôi đang sử dụng phiên bản Qt 3.3.7 và PyQt phiên bản 3.5.5-29 trên openSuSE 10.2, nếu điều đó có liên quan.

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

Trả lời

4

QMainWindow có hành vi đặc biệt cho tiện ích con trung tâm mà QDialog không làm. Để đạt được hành vi mong muốn, bạn cần tạo một layout, thêm vùng văn bản vào bố cục và gán bố cục cho hộp thoại.

2

Tôi đã xem xét sử dụng QLayout trước đây nhưng không có may mắn. Tôi đã cố gắng làm một cái gì đó như

dialog.setLayout(some_layout) 

nhưng tôi không thể có cách tiếp cận đó để làm việc nên tôi đã từ bỏ.

Sai lầm của tôi là tôi đã cố gắng chuyển bố cục vào hộp thoại khi tôi đáng lẽ phải chuyển hộp thoại đến bố cục.

Thêm các dòng

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

đến hết TestDialog.__init__ sửa chữa vấn đề.

Nhờ Monjardin đã nhắc tôi xem xét lại bố cục.

2

Chỉ cần thêm một chút lưu ý về điều này - tôi đã cố gắng để có một cửa sổ con sinh ra từ một ứng dụng, mà là một QDialog, chứa một đơn QTextEdit như một đứa trẻ/nội dung - và tôi muốn QTextEdit để thay đổi kích thước tự động bất cứ khi nào các thay đổi kích thước cửa sổ QDialog. Điều này dường như đã thực hiện thủ thuật cho tôi với 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_() 
Các vấn đề liên quan