2011-12-22 7 views
8

とダイアログリサイズ:私はこのコードのサンプルを持ってPyQt4

import sys 
from PyQt4.QtGui import (QApplication, QHBoxLayout, QVBoxLayout, QDialog, 
              QFrame, QPushButton, QComboBox) 

class Form(QDialog): 
    def __init__(self, parent=None): 
     super(Form, self).__init__(parent) 

     moreButton = QPushButton('moreButton') 
     moreButton.setCheckable(True) 
     resizeButton = QPushButton('Resize') 
     combo = QComboBox() 
     combo.addItems(['item1', 'item2']) 

     layout1 = QHBoxLayout() 
     layout1.addWidget(moreButton) 
     layout1.addWidget(resizeButton) 

     layout2 = QHBoxLayout() 
     layout2.addWidget(combo) 
     self.frame = QFrame() 
     self.frame.setLayout(layout2) 
     self.frame.hide() 

     layout3 = QVBoxLayout() 
     layout3.addLayout(layout1) 
     layout3.addWidget(self.frame) 

     moreButton.toggled.connect(self.frame.setVisible) 
     moreButton.clicked.connect(self.method) 
     resizeButton.clicked.connect(self.method) 

     self.setLayout(layout3) 
     self.resize(630, 50) 

    def method(self): 
     if self.frame.isVisible():   
      self.resize(630, 150) 
     else: 
      self.resize(630, 250) 

app = QApplication(sys.argv) 
form = Form() 
form.show() 
app.exec_() 

を私はそれを実行し、moreButtonは、コンボボックスをクリックしたときに表示されるか、消えます。ダイアログのサイズも変更されます。しかし、私は方法を変更した場合:

def method(self): 
    if self.frame.isVisible():   
     self.resize(630, 150) 
    else: 
     self.resize(630, 50) 

サイズ変更がうまくいかない(コンボが隠されているときの初期サイズを設定するために)。しかし、同じメソッドに接続されているresizeButtonをクリックすると、サイズ変更が正しく機能します。

このような結果を得るための他の方法があることは知っています(layout.setSizeConstraint(QLayout.SetFixedSize)など)が、サイズを明示的に宣言したいと思います。

私は間違っていますか?

答えて

5

私の推測では、あなたはそれがあなたの後にその大きさを再調整する時間を持って前にQDialogのサイズを変更しようとしているということですものを隠す。したがって、resizeが呼び出されたときには、minimumSizeがあり、ボタンとコンボボックスが確実に表示されます。しばらくしての後にと呼ぶと、今度は適切なmiminumSizeがあり、正しく応答します。私はこれに対処するためだったら、私はちょうどレイアウトにリサイズ管理のままとsizeConstraintを使用したい、

def method(self): 
    if self.frame.isVisible(): 
     # uncomment below, if you like symmetry :) 
     # self.setMinimumSize(630, 150) 
     self.resize(630, 150) 
    else: 
     self.setMinimumSize(630, 50) 
     self.resize(630, 50) 

しかし:

クイックフィックスは、手動でリサイズ前minimumSizeをオーバーライドしています。これらのレイアウトはとにかくです。

+0

はい、これが原因かもしれません。この変更で正常に動作します。上記のように、 "layout3.setSizeConstraint(QLayout.SetNoConstraint)"でも動作します。後者は「より良い」ソリューションですか? – Ilias95

+0

最後に私は、より複雑な状況(したがってより複雑なui)では、その答えだけがうまく動作することに気づいた。どうもありがとうございました! – Ilias95

1

これを試しましたか?私が誤解しない限り、これはあなたがしたいことです。

def method(self): 
    if self.frame.isVisible(): 
     self.resize(630, 150) 
     self.frame.setVisible(False) 
    else: 
     self.resize(630, 50) 

編集:最終的な答えは layout3.setSizeConstraint(QLayout.SetNoConstraint)である

+0

私はフレームを表示または非表示に設定しています。 "moreButton.toggled.connect(self.frame.setVisible)"がこれを担当します。 問題は、フレームを非表示にすると、ダイアログを元のサイズに戻すことができず、空きスペースがあることです。 – Ilias95

+0

ああ、申し訳ありませんが、今私はlayout3.setSizeConstraint(QLayout.SetNoConstraint) – NotCamelCase

+0

とは異なる解決策を考えることができません。ありがとうございました! – Ilias95

2

この問題は、イベントが処理される順序によって発生しているように見えます。

ここでは簡単な修正です:

def method(self): 
    app.processEvents() 
    if self.frame.isVisible():   
     self.resize(630, 150) 
    else: 
     self.resize(630, 50) 
+0

はい、それも動作します。 – Ilias95

3

はこの質問と回答は、私の状況で有用だった。また一方でQLayout/QVBoxLayoutは、ユーザーに可変サイズのコンテンツ/メッセージのQLabelを含むとQDialogの自動サイズ調整全体のQDialogコンテナの境界にある二重矢印カーソルを避けます。ダイアログ自体のsizePolicyはFixedに設定されていましたが、矢印はサイズ変更できなくても表示されます(変更はしません)。そして、内部レイアウトを自動的に/魔法のようにサイズ変更しても、レイアウト上でSetFixedSizeを使用すると(驚き、驚き)、QDialog全体の厄介な二重矢印が消えてしまいます。

QDialog: QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) 
QLayout: setSizeConstraint(QLayout.SetFixedSize) 
QLabel: QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) 

...そして今、適切にラベルに含まれているボリュームへのダイアログのサイズ自体はまだダイアログ自体は、情報やエラーメッセージに適している、(一見)ユーザがサイズ変更可能ではありません。

私には直観に反すると思われたので、他の人にはここで追加する価値があると思った。
もう少し詳しく...

self.label = QtGui.QLabel(self) 
self.label.sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 
self.label.setSizePolicy(self.label.sizePolicy) 
self.label.setMinimumSize(QtCore.QSize(450, 40)) 
self.label.setWordWrap(True) 

self.verticalLayout = QtGui.QVBoxLayout(self) 
# get rid of overall dialog resize arrows 
self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetFixedSize) # no resize arrows 
self.verticalLayout.addWidget(self.label) 
関連する問題