Я пытаюсь создать синхронизированную пару 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_())
Однако, это приводит к тому, что оба сигнала испускаются одновременно (из-за setValue
и setText
запускаются соответствующие сигналы), а также по какой-то причине сохраняет при попытке ввести курсор в начало текстовой области.
Как изменить значение текста / ползунка, не вызывая соответствующие сигналы?