0

Python 2.5.4 PyQt4

我将 QDoubleSpinBox 子类化为在 focusIn 事件上发出信号:



#Custom widgets for DPL GUI
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class DPLDoubleSpinBox(QDoubleSpinBox):

    __pyqtSignals__ = ("valueChanged(double)", "focusIn()")

    def __init__(self, *args):
        QDoubleSpinBox.__init__(self, *args)

    def event(self, event):
        if(event.type()==QEvent.FocusIn):
            self.emit(SIGNAL("focusIn()"))
            #self.clear() Works as expected
            self.selectAll() #See below                  

        return QDoubleSpinBox.event(self, event)

if __name__ == "__main__":

    import sys

    app = QApplication(sys.argv)
    widget = DPLDoubleSpinBox()
    widget2 = DPLDoubleSpinBox()
    widget.show()
    widget2.show()
    sys.exit(app.exec_())

如果您在一个框内单击,然后杀死另一个窗口,它可以工作。如果您单击一个内部,然后单击另一个,然后将焦点放在桌面上的任何其他窗口上,它似乎可以工作。

我认为这是一个焦点问题,但无法追踪。我只需要它在单击时全选。我尝试通过它的行编辑指针来做,但我得到了相同的结果。尝试强制关注其他小部件,但结果仍然相同。

您可以连接自定义插槽以在它发出“focusIn()”时触发。然后您可以使用任何QSpinBox.selectAll(),它可以工作,只是不能在其自身上工作。

4

3 回答 3

2

我知道这个问题已有两年多的历史了,但由于它是谷歌搜索“qspinbox select on focus”时的第一个结果之一,我想为后代留下一个解决方案。

问题是 QSpinBox.lineEdit() 的行为。使用focusInEvent,您可以调用selectAll(),但由于某种原因,QLineEdit 的mousePressEvent 在焦点事件之后立即清除选择。请参阅此处以获取解释。

解决方案是为 QSpinBox.lineEdit() 小部件或子类 QLineEdit 安装事件过滤器并调用 QSpinBox.setLineEdit()。无论哪种方式,上面的链接都将向您展示如何通过保留布尔标志并过滤 focusInEvent 和 mousePressEvent 来实现所需的行为。

于 2012-02-02T10:26:35.280 回答
1

根据这个,在 overriden 内部QTimer.singleShot调用,然后魔术就会发生。selectAllfocusInEvent

class SpinBox(QSpinBox):
    def focusInEvent(self, event: QFocusEvent) -> None:
        QTimer.singleShot(0, self.selectAll)

或像这样(不推荐):

b = QSpinBox()
b.focusInEvent = lambda _: QTimer.singleShot(0, b.selectAll)
于 2021-08-30T05:23:45.440 回答
0

我将事件更改为QEvent.Enter

现在它将self.selectAll()

我可以摆脱这个,因为它是针对触摸屏应用程序的,所以用户不会明显看出有什么不对劲。我仍然很想知道我错过了什么,或者这只是一个错误。

于 2009-12-13T19:35:58.153 回答