首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python同步错误

python同步错误
EN

Stack Overflow用户
提问于 2022-10-22 06:48:04
回答 1查看 69关注 0票数 0

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

代码语言:javascript
复制
    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行),那么它将无法在同一行中精确地同步。(特别是当我通过鼠标轮和滚动条滚动小部件时)。如何使它们保持精确同步?谢谢!

以下代码用于测试:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-25 20:25:19

测试脚本:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74161615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档