質問

ダイアログ自体のサイズが変更されると、QDialogのウィジェットを自動的にサイズ変更するのが困難になります。

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

ダイアログのテキストエリアを自動的にサイズ変更する方法はありますか?ダイアログ自体とその中の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()
役に立ちましたか?

解決

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

他のヒント

以前にQLayoutを使用することを見ましたが、運がありませんでした。私は次のようなことをしようとしていた

dialog.setLayout(some_layout)

しかし、私は仕事へのそのアプローチを得ることができなかったので、私はあきらめました。

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

行の追加

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

TestDialog .__ init __ の最後までは問題を修正します。

レイアウトの再検討を促してくれたMonjardinに感謝します。

これについて少しメモを追加します-アプリケーションから子ウィンドウを生成しようとしました。これは、 QTextEdit を単一の QTextEdit child / content-そして、 QDialog ウィンドウのサイズが変更されるたびに QTextEdit が自動的にサイズ変更することを望みました。これは私にとって 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