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(),它可以工作,而不是自己。
答案 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()
我可以逃脱这个因为它适用于触摸屏应用程序,所以用户不会明白某些东西是不对的。我仍然想知道我错过了什么,或者这只是一个错误。