在PyQt5中编辑完成信号的QSpinBox?

2024-09-30 12:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

当我为QSpinBox使用valueChanged信号时,当我单击箭头时,以及当我在QSpinBox的文本字段中键入任何字符时,它都会做出反应。你知道吗

我希望QSpinBox有一个editingFinished信号,所以当我更改spinbox文本字段中的值时,它只在Enter或Tab上起作用。你知道吗

显然,根据以下链接,这曾经是一种可能性:

不幸的是,当我使用此代码时:

self.spinbox.editingFinished.connect(self.on_spinbox_change_value)

。。。我得到:

...
  File "test/test.py", line 63, in __init__
    self.spinbox.editingFinished.connect(self.on_spinbox_change_value)
TypeError: decorated slot has no signature compatible with editingFinished()

所以,显然,这在PyQt5中不再是一种可能性了?有没有一个变通方法可以替代?你知道吗


编辑:一个最小的可复制示例:

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

class Example(QWidget):
  def __init__(self):
    super(Example, self).__init__()
    self.initUI()

  def initUI(self):

    self.slider_hbox = QHBoxLayout()

    self.tspinbox = QSpinBox()
    self.tspinbox.setMinimumSize(1,1)
    self.tspinbox.setMaximum(100)

    #self.tspinbox.valueChanged.connect(self.on_tspinbox_change) # works, but reacts on every new character typed in textbox of spinbox
    self.tspinbox.editingFinished.connect(self.on_tspinbox_change) # TypeError: decorated slot has no signature compatible with editingFinished()

    self.slider_hbox.addWidget(self.tspinbox, 1)

    self.setLayout(self.slider_hbox)

    self.setGeometry(300, 300, 220, 170)
    self.setWindowTitle('Tester')
    self.show()

  @pyqtSlot(int)
  def on_tspinbox_change(self, value):
    print("on_tspinbox_change {}".format(value))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = Example()
  sys.exit(app.exec_())

Tags: fromimportselfinitvalueonexampleconnect
1条回答
网友
1楼 · 发布于 2024-09-30 12:27:13

事实上,它是有效的-我只是在粘贴@pyqtSlot(int)时出错了-它应该是@pyqtSlot()(分别是def on_tspinbox_change(self):);下面是正确的代码:


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

class Example(QWidget):
  def __init__(self):
    super(Example, self).__init__()
    self.initUI()

  def initUI(self):

    self.slider_hbox = QHBoxLayout()

    self.tspinbox = QSpinBox()
    self.tspinbox.setMinimumSize(1,1)
    self.tspinbox.setMaximum(100)

    #self.tspinbox.valueChanged.connect(self.on_tspinbox_change) # works, but reacts on every new character typed in textbox of spinbox
    self.tspinbox.editingFinished.connect(self.on_tspinbox_change) # works now, if not using int argument (so @pyqtSlot(), instead of @pyqtSlot(int), etc)

    self.slider_hbox.addWidget(self.tspinbox, 1)

    self.setLayout(self.slider_hbox)

    self.setGeometry(300, 300, 220, 170)
    self.setWindowTitle('Tester')
    self.show()

  @pyqtSlot()
  def on_tspinbox_change(self):
    print("on_tspinbox_change {}".format( self.tspinbox.value() ))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = Example()
  sys.exit(app.exec_())

现在,只有当您在spinbox文本字段中键入内容后按回车键时才有打印输出,而不是在spinbox文本字段中的每个按键上。。。你知道吗

相关问题 更多 >

    热门问题