2015-01-28 7 views
6

하나의 위젯이 숨겨져있는 경우 기본 창의 크기를 자동으로 조정하는 가장 좋은 방법은 무엇입니까? 위젯을 다시 볼 수있게하려면 창 크기를 조정해야합니다. 아래 이미지를 참조하십시오 ...PySide : 하나의 위젯이 숨겨져있는 경우 기본 창의 크기를 조정하는 가장 좋은 방법은 무엇입니까?

MainWindow (sizePolicy), centralwidget (sizePolicy, layoutSizeConstraint) 및 gridLayout (sizePolicy, layoutSizeConstraint)에 대한 Qt 디자이너에서 설정해야하는 설정은 무엇입니까?

텍스트 편집기 위젯을 숨기려면 어떻게해야합니까? self.textEditObject.setVisible(False) 작동 : textEditObject가 표시되지 않지만 이것이 창 크기를 조정하는 올바른 방법입니까?

원하는 동작을 얻을 수 없기 때문에 몇 가지 기본적인 내용을 이해할 수 없다고 생각합니다.

enter image description here

+0

가능한 [자녀가 숨겨져있을 때 위젯 크기 조정] (http : // stackoverflow.com/questions/2469186/resizing-qt-widgets-when-their-children-are-hidden) – Trilarion

답변

3

당신은 위젯을 숨기고 후 minimumSizeHint()에 창 크기를 조정할 수 있습니다 :

self.resize(minimumSizeHint()) 

이 최소 크기로 창을 축소합니다. 당신은 단지 높이 축소하려면

, 당신은 같은 것을 수행 할 수 있습니다

self.resize(width(), minimumSizeHint().height()) 

을하지만 일부 이벤트는 이벤트 루프에서 처리 될 때까지 최소 크기가 계산되지 않는다는 것을 고려해야한다. 따라서 위젯을 숨길 때 일부 반복에 대해 이벤트 루프를 처리 한 다음 최소 크기로 크기를 조정하면됩니다.

이 같은입니다 :

for i in range(0, 10): 
     QApplication.processEvents() 

self.resize(width(), minimumSizeHint().height()) 

또 다른 옵션은 하나의 샷은 최소로 창 크기를 조정하는 슬롯을 호출하는 QTimer이다. 이 방법으로 창 크기를 조정하면 최소 크기 힌트가 올바르게 계산됩니다.

+0

위젯을 숨기면 고맙지 만 작동합니다. 위젯을 hidding하기 위해'self.resize (self.width(), self.minimumSizeHint(). height())'를 사용하고'self.resize (self.width(), self.maximumHeight())'를 사용하면 다시 보입니다. 하지만 나는'maximumHeight()'를 사용하고 싶지 않다. 당신의 방법과 같은 방법으로 그것을 어떻게 할 수 있습니까? 주의 :'self.adjustSize()'는 내 코드에서 작동하지 않습니다. (Trilarion의 메일에 대한 내 의견을보십시오). – Igor

+0

위젯을 볼 때도 동일한 방법을 사용할 수 있습니다. 'minimumSizeHint'를 다시 사용하면 위젯이 보이게되고 그에 따라 최소 크기가 계산됩니다. – Nejat

+0

@Najat 동일한 접근법이 내 코드에서 창 크기를 확대하는 데 작동하지 않습니다. 나는 이유를 모른다. 나는'self.adjustSize()'와 같은 문제가있다. – Igor

1

수동 크기 조정보다 더 단순한 것은 QWidget.adjustSize()입니다. 당신은 내가 실제로 단지 어느 정도하지만 완전히 축소 관리하는 QMainWidget이있는 경우

from PySide import QtGui 

def hide_show(): 
    x.setVisible(not x.isVisible()) # toggles visibility of the label 
    w.adjustSize() # adjusts size of widget 

app = QtGui.QApplication([]) 

w = QtGui.QWidget() 
l = QtGui.QVBoxLayout(w) 
b = QtGui.QPushButton('Click me') 
l.addWidget(b) 
x = QtGui.QLabel('Some Text') 
l.addWidget(x) 
b.clicked.connect(hide_show) 
w.show() 

app.exec_() 

: 여기

은 예입니다. 아마 다른 솔루션보다 낫다.

from PySide import QtGui 

def hide_show(): 
    x.setVisible(not x.isVisible()) # toggles visibility of the label 
    w2.adjustSize() # adjusts size of widget 
    w.adjustSize() # adjusts size of main window 

app = QtGui.QApplication([]) 

w = QtGui.QMainWindow() 
w2 = QtGui.QWidget() 
l = QtGui.QVBoxLayout(w2) 
b = QtGui.QPushButton('Click me') 
l.addWidget(b) 
x = QtGui.QTextEdit('Some Text') 
l.addWidget(x) 
b.clicked.connect(hide_show) 
w.setCentralWidget(w2) 
w.show() 

app.exec_() 
+0

그것은 작동합니다, 고마워요! textEditObject를 보이게하여 창 크기를 조정하고 싶습니다. 그러나'self.adjustSize()'는이 경우 작동하지 않습니다. 내가 어떻게 작동하게 할 수 있니? – Igor

+0

@Igor 나는 당신이 의미하는 바를 따라갈 수 없습니다. 내 예제는 보이지 않게되고 모든 종류의 위젯 (label, textedit, ...)에 대해 표시되는 데 사용됩니다. 그건 중요하지 않아. 당신이 의미하는 바를 더 구체적으로 지정할 수 있습니까? – Trilarion

+0

주 창 (QMainWindow)을 확대하려면 예제가 작동하지 않습니다. 나는 이유를 모른다. 따라와 줄래? 중요 할 수도 있습니다 : 저는 MainWindow의 중앙 위젯에 수직 레이아웃 (QVBoxLayout)을 가지고 있습니다. – Igor

0

확인. 다음은 Nejat 제안 및 Trilarions 예제를 기반으로 한 QTimer 접근 방식을 테스트하는 코드입니다. 비록 Nejat이 그것이 나를 위해 지금까지 가장 잘 작동하는지에 대한 것이 었는지 나는 알지 못한다.

from PySide import QtCore, QtGui 


class TestWin(QtGui.QMainWindow): 
    def __init__(self): 
     super(TestWin, self).__init__() 
     self.w2 = QtGui.QWidget() 
     self.l = QtGui.QVBoxLayout(self.w2) 

     self.h = QtGui.QHBoxLayout(self.w2) 
     self.b = QtGui.QPushButton('hierarchic adjustSize()') 
     self.b2 = QtGui.QPushButton('deferred resize()') 
     self.h.addWidget(self.b) 
     self.h.addWidget(self.b2) 
     self.l.addLayout(self.h) 

     self.x = QtGui.QTextEdit('Some Text') 
     self.l.addWidget(self.x) 
     self.b.clicked.connect(self.adjustSize_hide_show) 
     self.b2.clicked.connect(self.qtimer_hide_show) 
     self.setCentralWidget(self.w2) 

    def toggleVis(self): 
     self.x.setVisible(not self.x.isVisible()) 

    def adjustSize_hide_show(self): 
     self.toggleVis() 
     self.w2.adjustSize() # adjusts size of widget 
     self.adjustSize() # adjusts size of main window 

    def qtimer_hide_show(self): 
     self.toggleVis() 
     _timer = QtCore.QTimer() 
     _timer.singleShot(30, self._resizeHeight) 

    def _resizeHeight(self): 
     self.resize(self.width(), self.minimumSizeHint().height()) 


if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    win = TestWin() 
    win.show() 
    app.exec_() 

이렇게하면 앱에 액세스 할 필요가 없으며 실제로 특정 방향으로 크기를 조정할 수 있습니다.

여기에 지연에 의존하기에는 너무 편안하지 않습니다. 그러나 1ms 지연으로 90 %의 시간 동안 작동합니다! 내가 2ms를 시도하는 한 100 % 성공했습니다. 따라서 20ms는 거의 모든 경우에 성공할 것입니다 (레이아웃에 따라 매우 작은 깜박임을 유발할 수 있습니다)