PyQt4 QSpinBox.selectAll()没有按预期工作

时间:2009-12-12 00:30:07

标签: pyqt4 selectall

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(),它可以工作,而不是自己。

2 个答案:

答案 0 :(得分:2)

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

问题是QSpinBox.lineEdit()的行为。使用focusInEvent,您可以调用selectAll(),但由于某种原因,QLineEdit的mousePressEvent会在焦点事件后立即清除选择。有关说明,请参阅here

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

答案 1 :(得分:0)

我将活动更改为QEvent.Enter

现在它将self.selectAll()

我可以逃脱这个因为它适用于触摸屏应用程序,所以用户不会明白某些东西是不对的。我仍然想知道我错过了什么,或者这只是一个错误。