代码之家  ›  专栏  ›  技术社区  ›  Luke Woodward

Pyqt:让小部件在Qdialog中自动调整大小

  •  9
  • Luke Woodward  · 技术社区  · 16 年前

    我很难让Qdialog中的小部件在对话框本身调整大小时自动调整大小。

    在以下程序中,如果调整主窗口的大小,文本区域将自动调整大小。但是,当调整对话框的大小时,对话框中的文本区域保持相同的大小。

    是否有任何方法可以使对话框中的文本区域自动调整大小?我试过用 setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) 在对话框本身和内部的两个小部件上,但这似乎没有效果。

    如果相关的话,我将在OpenSUSE10.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 回复  |  直到 12 年前
        1
  •  4
  •   Judge Maygarden    16 年前

    qmainwindow对于中心小部件具有Qdialog不具有的特殊行为。要实现所需的行为,需要创建 layout ,将文本区域添加到布局并将布局分配给对话框。

        2
  •  2
  •   Luke Woodward    16 年前

    我以前看过使用qlayout,但没有运气。我想做点什么

    dialog.setLayout(some_layout)
    

    但我不能用这种方法工作,所以我放弃了。

    我的错误是我试图将布局传递到对话框,而我本应该将对话框传递到布局。

    添加线条

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

    到最后 TestDialog.__init__ 解决了问题。

    多亏了蒙贾尔丁提醒我重新考虑布局。

        3
  •  2
  •   sdaau    12 年前

    只是为了添加一点关于这个的注释-我试图从一个应用程序生成一个子窗口,它是一个 QDialog ,包含一个 QTextEdit 作为一个孩子/内容-我想要 QTEX 每当 Q对话 窗口大小更改。这似乎对我有好处 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_()
    
        4
  •  1
  •   hollahhoo    14 年前

    退房 Python QT Automatic Widget Resizer 它应该工作得很好。