PyQt:QDialogでウィジェットのサイズを自動的に変更する
質問
ダイアログ自体のサイズが変更されると、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自動ウィジェットリサイズをご覧ください。うまく動作するはずです。