PyQt:автоматическое изменение размера виджетов в QDialog

StackOverflow https://stackoverflow.com/questions/406939

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня возникают трудности с автоматическим изменением размера виджетов в QDialog при изменении размера самого диалогового окна.

В следующей программе размер текстовой области изменяется автоматически, если вы изменяете размер главного окна.Однако текстовая область внутри диалогового окна остается того же размера при изменении размера диалогового окна.

Есть ли какой-нибудь способ автоматически изменить размер текстового поля в диалоговом окне?Я пробовал использовать setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) на само диалоговое окно и два виджета внутри, но это, похоже, не оказывает никакого эффекта.

Я использую Qt версии 3.3.7 и PyQt версии 3.5.5-29 для openSUSE 10.2, если это уместно.

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()
Это было полезно?

Решение

QMainWindow имеет особое поведение для центрального виджета, которого нет в QDialog.Для достижения желаемого поведения вам необходимо создать планировка, добавьте текстовую область в макет и назначьте макет диалоговому окну.

Другие советы

Я уже рассматривал возможность использования QLayout раньше, но безуспешно.Я пытался сделать что-то вроде

dialog.setLayout(some_layout)

но я не смог заставить такой подход сработать, поэтому сдался.

Моя ошибка заключалась в том, что я пытался передать макет в диалоговое окно, когда я должен был передавать диалоговое окно в макет.

Добавление строк

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

до конца TestDialog.__init__ устраняет проблему.

Спасибо Монжардену за то, что побудил меня пересмотреть макеты.

Просто чтобы добавить небольшое замечание по этому поводу - я пытался создать дочернее окно, созданное из приложения, которое является 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_()

Проверьте Автоматический Регулятор размера Виджета Python QT Предполагается, что это должно хорошо работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top