Python Pyside-当QLineEdit获得焦点时选择所有文本

Python Pyside-当QLineEdit获得焦点时选择所有文本,python,qt,pyside,qlineedit,Python,Qt,Pyside,Qlineedit,我是Qt/PySide的新手。我希望QLineEdit在它获得焦点时选择其中的所有文本。获得焦点并选择所有文本后,只有在失去焦点并再次获得焦点后,才应选择所有文本。当我在QLineEdit获得焦点后更改光标位置时,它不应选择所有文本。我该怎么做 更新:我的当前代码按照Ashwani Kumar的建议进行了改进。但我还是无法让它工作: import sys from PySide.QtGui import QLineEdit, QApplication, QVBoxLayout, QWidget

我是Qt/PySide的新手。我希望
QLineEdit
在它获得焦点时选择其中的所有文本。获得焦点并选择所有文本后,只有在失去焦点并再次获得焦点后,才应选择所有文本。当我在
QLineEdit
获得焦点后更改光标位置时,它不应选择所有文本。我该怎么做

更新:我的当前代码按照Ashwani Kumar的建议进行了改进。但我还是无法让它工作:

import sys
from PySide.QtGui import QLineEdit, QApplication, QVBoxLayout, QWidget
class MyLineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(MyLineEdit, self).__init__(parent)

    def focusInEvent(self, e):
        self.selectAll()      

app = QApplication(sys.argv)
top = QWidget()
layout = QVBoxLayout()
layout.addWidget(MyLineEdit())
layout.addWidget(MyLineEdit())
top.setLayout(layout)
top.show()
app.exec_()

您必须将
QLineEdit
子类化,然后使用新类而不是
QLineEdit
。 e、 g:-


使用
focusInEvent
,当您单击小部件时,它将被执行,但由于您单击,它将删除所选文本

要克服这一点,我们必须使用
鼠标pressevent
,这可以通过两种方式完成:

import sys
from PySide.QtGui import QLineEdit, QApplication, QVBoxLayout, QWidget
class MyLineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(MyLineEdit, self).__init__(parent)

    def mousePressEvent(self, e):
        self.selectAll()      

app = QApplication(sys.argv)
top = QWidget()
layout = QVBoxLayout()
layout.addWidget(MyLineEdit())
layout.addWidget(MyLineEdit())
top.setLayout(layout)
top.show()
app.exec_()
或者,您也可以通过简单地重写基本的
QLineEdit
类来实现:

txt_demo = QtGui.QLineEdit()
txt_demo.mousePressEvent = lambda _ : txt_demo.selectAll()

但是,由于我们正在修改mousePressEvent,每当您尝试单击文本时,它总是首先选择all。

对于未来的访问者,我发布了适合我的代码。由于我是新手,我不确定代码是否包含任何不当行为。如果有评论,我会更新我的代码/答案。代码:

import sys
from PySide.QtGui import QLineEdit, QApplication, QVBoxLayout, QWidget

class LineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)
        self.readyToEdit = True

    def mousePressEvent(self, e, Parent=None):
        super(LineEdit, self).mousePressEvent(e) #required to deselect on 2e click
        if self.readyToEdit:
            self.selectAll()
            self.readyToEdit = False

    def focusOutEvent(self, e):
        super(LineEdit, self).focusOutEvent(e) #required to remove cursor on focusOut
        self.deselect()
        self.readyToEdit = True

app = QApplication(sys.argv)
top = QWidget()
layout = QVBoxLayout()
layout.addWidget(LineEdit())
layout.addWidget(LineEdit())
top.setLayout(layout)
top.show()
app.exec_()

QTimer
解决方案如上所示:


另外,提供的解决方案不需要子类
QLineEdit

,方法名称中有一个输入错误。一定是“专注”没有听从你的建议。仍然无法找出问题所在。代码在我这方面写得很好。您面临的问题是什么。未选择焦点上的.text。如果我使用其他命令,例如self.undo()代替self.selectAll(),它会工作。但由于某些原因,self.selectAll()无法工作。谢谢。我还使用了局部变量和扩展的focusOut来确保在第二次点击时文本将被取消选择,光标将被定位在点击的地方。太棒了,很高兴我能帮上忙!self.deselect()调用似乎是多余的,但我在QGraphicsView中使用它,因此结果可能会有所不同。实际上,它似乎没有必要。当失去焦点时,即使没有该行,文本也会自动取消选择。
import sys
from PySide.QtGui import QLineEdit, QApplication, QVBoxLayout, QWidget

class LineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)
        self.readyToEdit = True

    def mousePressEvent(self, e, Parent=None):
        super(LineEdit, self).mousePressEvent(e) #required to deselect on 2e click
        if self.readyToEdit:
            self.selectAll()
            self.readyToEdit = False

    def focusOutEvent(self, e):
        super(LineEdit, self).focusOutEvent(e) #required to remove cursor on focusOut
        self.deselect()
        self.readyToEdit = True

app = QApplication(sys.argv)
top = QWidget()
layout = QVBoxLayout()
layout.addWidget(LineEdit())
layout.addWidget(LineEdit())
top.setLayout(layout)
top.show()
app.exec_()
import types
from PyQt4 import QtCore

def bind(func, to):
    "Bind function to instance, unbind if needed"
    return types.MethodType(func.__func__ if hasattr(func, "__self__") else func, to)

...
self.txtSrc.focusInEvent = bind(lambda w, e: QtCore.QTimer.singleShot(0, w.selectAll), self.txtSrc)