首页 > 解决方案 > PyQt - 结合 QSlider 和 QTextEdit

问题描述

我正在尝试创建一个QSlider-QTextEdit同步对,这样一个中的任何更改都会反映在另一个中。这是我的代码:

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class MainWindow(QMainWindow):
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)

        self.main_panel = QWidget(self)
        self.setCentralWidget(self.main_panel)

        grid = QGridLayout(self.main_panel)

        self.sl = QSlider(Qt.Horizontal, self)
        self.txt = QTextEdit(self)

        self._old_val = ""
        self.sl.valueChanged.connect(self._sl_to_txt)
        self.txt.textChanged.connect(self._txt_to_sl)

        self.sl.setMinimum(1)
        self.sl.setMaximum(60)
        self.sl.setValue(30)

        grid.addWidget(self.sl, 0, 0)
        grid.addWidget(self.txt, 0, 1)

    def _sl_to_txt(self, val):
        print("SL->TXT")
        self.txt.setText(str(val))

    def _txt_to_sl(self):
        print("TXT->SL")
        val = self.txt.toPlainText()
        try:
            self.sl.setValue(int(val))
            self._old_val = val
        except ValueError:
            self.txt.setText(self._old_val)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

但是,这会导致两个信号同时发出(由于setValuesetText触发了各自的信号),并且由于某种原因,在尝试输入文本区域时,光标会一直放在文本区域的开头。

如何在不触发相应信号的情况下更改文本/滑块值?

标签: python-3.xpyqtpyqt5

解决方案


推荐阅读