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
シグナルから呼び出され、マウスクリックから呼び出されたときのように振る舞うようにすると、飛び降りる秒数が分かりますか?