python pyside6 qtextedit 同步错误

问题描述 投票:0回答:1

我有一个 pyside6 应用程序,它有 2 个 TextEdit 小部件,我希望 2 个 TextEdit 同步滚动。 此功能使用以下代码:

    self.scrollconnect1 = self.TextEdit_1.verticalScrollBar().valueChanged.connect(
        self.TextEdit_2.verticalScrollBar().setValue)
    self.scrollconnect2 = self.TextEdit_2.verticalScrollBar().valueChanged.connect(
        self.TextEdit_1.verticalScrollBar().setValue)

当 TextEdit 中的行数很少时,它可以正常工作,但是如果两个 TextEdit 中的行太多(大约 50,000 行),则它不会在同一行中精确同步。 (特别是当我通过鼠标滚轮和滚动条滚动小部件时)。 如何让它们精确同步?

以下代码用于测试:

from PySide6 import QtCore, QtGui, QtWidgets


class ScrollBar(QtWidgets.QScrollBar):
    valueUpdated = QtCore.Signal(int)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setTracking(True)
        self.actionTriggered.connect(self.handleAction)

    def handleAction(self, action):
        action = QtWidgets.QAbstractSlider.SliderAction(action)
        print(self.objectName(), action, (self.value(), self.sliderPosition()))
        if self.value() != self.sliderPosition():
            self.valueUpdated.emit(self.sliderPosition())


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.editTop = QtWidgets.QPlainTextEdit()
        self.editBtm = QtWidgets.QPlainTextEdit()
        self.editTop.setVerticalScrollBar(
            ScrollBar(self, objectName='EDIT-TOP'))
        self.editBtm.setVerticalScrollBar(
            ScrollBar(self, objectName='EDIT-BTM'))
        self.editTop.verticalScrollBar().actionTriggered.connect(
            lambda a: self.editBtm.verticalScrollBar().triggerAction(
                QtWidgets.QAbstractSlider.SliderAction(a)))
        self.editTop.verticalScrollBar().valueUpdated.connect(
            self.editBtm.verticalScrollBar().setValue)
        self.editBtm.verticalScrollBar().valueUpdated.connect(
            self.editTop.verticalScrollBar().setValue)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.editTop)
        layout.addWidget(self.editBtm)
        line = ' text' * 40
        # for index in range(50000):
        for index in range(500):
            self.editTop.insertPlainText("\n"+str(index) + line)
            self.editBtm.insertPlainText("\n"+str(index) + line)


if __name__ == '__main__':

    app = QtWidgets.QApplication(['Test'])
    window = Window()
    window.setGeometry(800, 100, 600, 400)
    window.show()
    app.exec()
python synchronization pyside
1个回答
1
投票

测试脚本:

from PySide6 import QtCore, QtGui, QtWidgets

class ScrollBar(QtWidgets.QScrollBar):
    valueUpdated = QtCore.Signal(int)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setTracking(True)
        self.actionTriggered.connect(self.handleAction)

    def handleAction(self, action):
        action = QtWidgets.QAbstractSlider.SliderAction(action)
        print(self.objectName(), action, (self.value(), self.sliderPosition()))
        if self.value() != self.sliderPosition():
            self.valueUpdated.emit(self.sliderPosition())

    def sliderChange(self, change):
        change = QtWidgets.QAbstractSlider.SliderChange(change)
        if (change == QtWidgets.QAbstractSlider.SliderValueChange and
            self.signalsBlocked()):
            self.blockSignals(False)
            print(self.objectName(), change, self.value())
            self.valueUpdated.emit(self.value())
        super().sliderChange(change)

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
#         self.editTop = QtWidgets.QTextEdit()
#         self.editBtm = QtWidgets.QTextEdit()
        self.editTop = QtWidgets.QPlainTextEdit()
        self.editBtm = QtWidgets.QPlainTextEdit()
        self.editTop.setVerticalScrollBar(
            ScrollBar(self, objectName='EDIT-TOP'))
        self.editBtm.setVerticalScrollBar(
            ScrollBar(self, objectName='EDIT-BTM'))
        self.editTop.verticalScrollBar().valueUpdated.connect(
            self.editBtm.verticalScrollBar().setValue)
        self.editBtm.verticalScrollBar().valueUpdated.connect(
            self.editTop.verticalScrollBar().setValue)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.editTop)
        layout.addWidget(self.editBtm)
        text = ' text' * 20
        # for index in range(50000):
        for index in range(500):
            line = f'{index}{text}\n'
            self.editTop.insertPlainText(line)
            self.editBtm.insertPlainText(line)

if __name__ == '__main__':

    app = QtWidgets.QApplication(['Test'])
    window = Window()
    window.setGeometry(800, 100, 600, 400)
    window.show()
    app.exec()
© www.soinside.com 2019 - 2024. All rights reserved.