2017-08-21 1 views
1

QWidgetがあり、多くのウィジェットを含む垂直のボックスレイアウトを持つシンプルなものがあります。私は、マウスクリック後とQLineEditのテキスト入力後に、新しいウィジェットを追加しています。QScrollAreaアイテムがテキスト入力から新しいアイテムを追加するときに飛び越さないようにする

ただし、スクロールエリアは、新しいアイテムを挿入した原因によって、動作が異なります。 textChanged()信号の後に私のaddTestLabel()が呼び出された場合、内容全体が1秒間飛び跳ねますが、同じaddTestLabel()がmouseclickイベントから呼び出された場合は、正確に動作しますが、それは私には意味がありません。

Gifの例では、まずクリックすると項目が挿入され、完全に機能してから入力を開始してジャンプします。それから私は戻ってクリックに行くと、それは最初のクリック後にジャンプしますが、その後、すべての更クリックすると、私が作ることができ、再び

最短最小限例ジャンプせずに挿入します。

import sys 

from PyQt5.QtCore import Qt 
from PyQt5.QtWidgets import QWidget, QApplication, QScrollArea, QVBoxLayout, QSizePolicy, QLineEdit 

from ui.tabdock.utils import * 


class ChatView(QWidget): 
    def __init__(self): 
     super().__init__() 

     #make the main window a vertical box layout 
     self._boxLayout = QVBoxLayout() 
     self._boxLayout.setAlignment(Qt.AlignTop) 
     self.setLayout(self._boxLayout) 


     # make a scroll area and put it at the top 
     self._scrollArea = QScrollArea() 
     self._scrollArea.setWidgetResizable(True) 
     self._boxLayout.addWidget(self._scrollArea) 

     # add a text input below the scroll area 
     self._textInput = QLineEdit() 

     # make it add a new item every time textChange event fires 
     #THIS RESULTS IN EVERYTHING JUMPING FOR A SECOND 
     self._textInput.textChanged.connect(lambda t: self.addTestLabel("text change add")) 

     self._boxLayout.addWidget(self._textInput) 

     # make a container view with a vertical box layout that will contain all the actual items 
     self.listContainerView = QWidget() 
     self.listContainerView.setLayout(QVBoxLayout()) 
     self.listContainerView.layout().setAlignment(Qt.AlignTop) 

     # put the container view inside the scroll area 
     self._scrollArea.setWidget(self.listContainerView) 

     #some items to get started 
     for i in range(10): 
      self.addTestLabel("label %s"%i) 

     #add new items whenever the mouse is pressed somewhere 
     # THIS INSERTS CORRECTLY WITHOUT JUMPING 
     self.mousePressEvent = lambda e:self.addTestLabel() 

    def addTestLabel(self, text = "complex widget goes here"): 
     label = QLabel(text) 
     label.setStyleSheet("border: 1px solid red;") 
     label.setFixedHeight(50) 
     self.listContainerView.layout().addWidget(label) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    cv = ChatView() 
    cv.show() 
    cv.setGeometry(400,400,1200,800) 
    sys.exit(app.exec_()) 

を、私は停止するにはどうすればよいですがtextChangedシグナルから呼び出され、マウスクリックから呼び出されたときのように振る舞うようにすると、飛び降りる秒数が分かりますか?

答えて

1

これは、スクロールエリアとそのコンテナビューにフォーカスがないときはいつでも、テキストボックスに入力したときにフォーカスがあったときなど、何かを追加した後すぐにジオメトリとレイアウトを更新しないということでした。コンテナウィジェットは、それが更新されるまでちょっと変わったように見えます。

ウィジェットを追加した後にself.listContainerView.updateGeometry()を追加するだけで、レイアウトを強制的に更新して修正しました。

関連する問題