10

ダイアログ自体のサイズが変更されたときに、QDialog のウィジェットを自動的にサイズ変更するのに苦労しています。

次のプログラムでは、メイン ウィンドウのサイズを変更すると、テキスト領域のサイズも自動的に変更されます。ただし、ダイアログのサイズを変更しても、ダイアログ内のテキスト領域は同じサイズのままです。

ダイアログのテキストエリアを自動的にサイズ変更する方法はありますか? ダイアログ自体とその中の 2 つのウィジェットで使用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

4 に答える 4

7

QMainWindow には、QDialog にはない中央ウィジェットの特別な動作があります。目的の動作を実現するには、レイアウトを作成する必要があり、テキスト領域をレイアウトに追加し、レイアウトをダイアログに割り当てます。

于 2009-01-02T14:56:35.063 に答える
3

これについてちょっとしたメモを追加するために-私はアプリケーションから子ウィンドウを生成しようとしていQDialogましQTextEditた. これは私のためにトリックを行ったようです:QTextEditQDialogPyQt4

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_()
于 2012-11-03T13:52:18.867 に答える
2

以前に QLayout の使用を見たことがありますが、うまくいきませんでした。私は何かをしようとしていた

dialog.setLayout(some_layout)

しかし、私はそのアプローチを機能させることができなかったので、あきらめました。

私の間違いは、ダイアログをレイアウトに渡す必要があるときに、レイアウトをダイアログに渡そうとしたことです。

行の追加

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

問題をTestDialog.__init__修正します。

レイアウトを再考するよう促してくれた Monjardin に感謝します。

于 2009-01-02T16:21:56.280 に答える
1

Python QT Automatic Widget Resizerを確認してください。うまく機能すると思われます。

于 2010-12-15T19:01:07.377 に答える