使用焦点事件获取QLineEdit和QTextEdit的单个插入符号

时间:2014-12-31 12:07:53

标签: events python-3.x focus pyqt4

我在同一页面上有一个QLineEdit(对于数据A)和QTextEdit(对于数据B)的面板。问题是光标在两个字段中都闪烁,我们无法轻易看到焦点在哪里。使用焦点事件(我需要)时会出现2个光标的问题。

我在每个字段上使用了focusInEvent和focusOutEvent,如下所示:

self.textedit_desc.focusInEvent = self.Change_fi_desc
self.textedit_desc.focusOutEvent = self.Change_fo_desc
self.lineedit_ref.focusOutEvent = self.Change_fo_ref

def Change_fo_ref(self, ev):
    self.MyNeed()
    self.lineedit_ref.setCursorPosition(0) # left
    ev.accept()

def Change_fo_desc(self, ev):
    self.MyNeed()
    self.textedit_desc.setStyleSheet("background-color: rgb(243, 243, 243);")
    self.textedit_desc.setCursorWidth(0)
    ev.accept()

def Change_fi_desc(self, ev):
    self.lineedit_ref.setCursorPosition(0) # left
    self.textedit_desc.setStyleSheet("background-color: rgb(255, 255, 240);")
    self.textedit_desc.setCursorWidth(1)
    self.textedit_desc.moveCursor(13) # end of line
    ev.accept()

由于两个游标问题,我在文本编辑字段中添加了颜色更改。 但即使我使用焦点事件,我也希望有一个光标。

1 个答案:

答案 0 :(得分:0)

多个游标的问题发生是因为您完全覆盖了默认行为,而不是重新实现它。

由于看起来你只需要监听焦点事件,我认为事件过滤器会更合适。

以下是基于示例代码使用事件过滤器的方法:

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        ...
        self.textedit_desc.installEventFilter(self)
        self.lineedit_ref.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.FocusIn:
            if source is self.textedit_desc:
                self.lineedit_ref.setCursorPosition(0) # left
                self.textedit_desc.setStyleSheet(
                    "background-color: rgb(255, 255, 240);")
                self.textedit_desc.setCursorWidth(1)
                self.textedit_desc.moveCursor(13) # end of line
        elif event.type() == QtCore.QEvent.FocusOut:
            if source is self.textedit_desc:
                self.MyNeed()
                self.textedit_desc.setStyleSheet(
                    "background-color: rgb(243, 243, 243);")
                self.textedit_desc.setCursorWidth(0)
            elif source is self.lineedit_ref:
                self.MyNeed()
                self.lineedit_ref.setCursorPosition(0) # left
        return super(MainWindow, self).eventFilter(source, event)