Python 使用QSCISCINTILA.findNext进行反向搜索未按预期工作

Python 使用QSCISCINTILA.findNext进行反向搜索未按预期工作,python,find,pyqt5,qscintilla,Python,Find,Pyqt5,Qscintilla,如果我搜索字母xforward(按钮Next),一切正常,但只要我改变方向(按钮Previous),就会发生以下情况: QsciScintilla.findFirst()不移动所选内容。即,第一次按下按钮Previous不起任何作用 qscisintila.findNext()以2步为单位移动,因此跳过一个字符 ATM我在考虑将逻辑从C++到Python的查找操作转换,从而有可能解决这个问题,但是知道我犯了一些新手错误,这样就避免了所有额外的工作…… 代码如下: from PyQt5.Qt

如果我搜索字母
x
forward(按钮
Next
),一切正常,但只要我改变方向(按钮
Previous
),就会发生以下情况:

  • QsciScintilla.findFirst()
    不移动所选内容。即,第一次按下按钮
    Previous
    不起任何作用
  • qscisintila.findNext()
    以2步为单位移动,因此跳过一个字符

ATM我在考虑将逻辑从C++到Python的查找操作转换,从而有可能解决这个问题,但是知道我犯了一些新手错误,这样就避免了所有额外的工作…… 代码如下:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qsci import *
import sys


class FindAndReplace(QWidget):
    def __init__(self, *arg, **kwarg):
        super(self.__class__, self).__init__(*arg, **kwarg)

        rows = QVBoxLayout()

        self.editor = QsciScintilla()
        self.editor.setText(f'{"x"*40}\n{"y"*40}\n{"z"*40}\n')
        rows.addWidget(self.editor)

        self.text_to_find = ''
        self.state_ = tuple()

        self.find = QLineEdit()
        self.find_previous = QPushButton('&Previous')
        self.find_next = QPushButton('&Next')
        self.find_lbl = QLabel('&Find')
        self.find_lbl.setBuddy(self.find)
        row = QHBoxLayout()
        for w in (self.find_lbl, self.find, self.find_previous, self.find_next):
            row.addWidget(w)
        rows.addLayout(row)

        self.re = QCheckBox('&Regular expressions')
        self.cs = QCheckBox('&Case sensitive')
        self.wo = QCheckBox('Whole &words')
        self.wrap = QCheckBox('Wrap aroun&d')
        self.show_ = QCheckBox('&Unfold folded text')
        self.posix = QCheckBox('POSI&X-compatible RE')
        row = QHBoxLayout()
        for w in (self.re, self.cs, self.wo, self.wrap, self.show_, self.posix):
            row.addWidget(w)
        rows.addLayout(row)

        self.setLayout(rows)

        self.find_previous.clicked.connect(lambda: self.findText(forward = False))
        self.find_next.clicked.connect(lambda: self.findText(forward = True))

    def findText(self, forward):
        text_to_find = self.find.text()
        state_ = ( \
            self.re.isChecked(), self.cs.isChecked(),
            self.wo.isChecked(), self.wrap.isChecked(),
            forward, -1, -1,
            self.show_.isChecked(), self.posix.isChecked(),
        )

        if text_to_find != self.text_to_find or state_ != self.state_:
            self.text_to_find = text_to_find
            self.state_ = state_
            # search with new conditions.
            self.editor.findFirst(text_to_find, *state_)
        else:
            # search with previously set conditions.
            self.editor.findNext()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    FindAndReplace().show()
    sys.exit(app.exec_())

findNext
函数在我看来似乎有问题。如果我使用
getSelection
findFirst
中显式输入
line
index
,并避免同时使用
findNext
,则一切正常:

def findText(self, forward):
    text_to_find = self.find.text()

    if forward:
        line, index = self.editor.getSelection()[2:]
    else:
        line, index = self.editor.getSelection()[:2]

    state_ = (
        self.re.isChecked(), self.cs.isChecked(),
        self.wo.isChecked(), self.wrap.isChecked(),
        forward, line, index,
        self.show_.isChecked(), self.posix.isChecked(),
        )

    self.text_to_find = text_to_find
    self.state_ = state_
    self.editor.findFirst(text_to_find, *state_)
查看最新的源代码(qscisintilla.cpp,第1853行),我看到了以下内容:

//最后调整开始位置,这样我们就不会再找到相同的位置了。
如果(findState.forward)
findState.startpos=targetend;
如果((findState.startpos=targetstart-1)<0,则为else
findState.startpos=0;
我可能误解了代码的意图,但为什么它在这里减去一?AFAICS,这将在向后搜索时创建一个off by one错误