moveCursor(start,end)引发异常“ QTextCursor'没有属性keepAnchor”

时间:2019-02-06 14:30:08

标签: python-3.x pyqt5

从主窗口运行查找文本对话框,其中实际文本位于QTextEdit字段中。找到文本后,self.moveCursor(start,end)导致异常“ QTextCursor没有属性'keepAnchor'

在Peter Goldsborough发表“用PyQt构建文本编辑器:第3部分并集成了四个显示MySql查询的停靠窗口”之后,我正在做一个测试编辑器。

class Main(QMainWindow):

    def __init__(self, parent = None):
        super().__init__( parent)
        self.filename = ""
        self.qdb = self.check_connection()
        self.initUI()
    def initUI(self):
        ........
        self.text = QTextEdit()
        self.text.setTabStopWidth(33)
        self.text.cursorPositionChanged.connect(self.cursorPosition)
        ......
     def initToolBar(self)
        self toolBar = self.addToolBar("Options")
        self.findAction = QAction(QIcon("icons/find.png","Find and Replace, self)
        self.findAction.triggered.connect(find.Find(self).show)
        .........................................

class Find(QDialog):

    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.parent = parent
        self.lastMatch = None
        self.initUI()

    def initUI(self):

        findButton = QPushButton("Find", self)
        findButton.clicked.connect(self.find)
        replaceButton = QPushButton("Replace", self)
        replaceButton.clicked.connect(self.replace)
        allButton = QPushButton("Replace All")
        allButton.clicked.connect(self.replaceAll)

        self.normalRadio = QRadioButton("Normal", self)
        self.normalRadio.toggled.connect(self.normalMode)
        self.regexRadio = QRadioButton("Regex", self)
        self.regexRadio.toggled.connect(self.regexMode)

        self.findField = QTextEdit(self)
        self.findField.resize(250,50)
        self.replaceField = QTextEdit(self)
        self.replaceField.resize(250, 50)

        optionsLabel = QLabel("Options: ", self)

        self.caseSen = QCheckBox("Case Sensitive", self)
        self.wholeWords = QCheckBox("Whole Words", self)

        spacer = QWidget(self)
        spacer.setFixedSize(0,10)

        layout = QGridLayout()

        layout.addWidget(self.findField, 1, 0, 1, 4)
        layout.addWidget(self.normalRadio,2,2)
        layout.addWidget(self.regexRadio, 2, 3)
        layout.addWidget(findButton,2, 0,1, 2)

        layout.addWidget(self.replaceField, 3, 0, 1, 4)
        layout.addWidget(replaceButton,4, 0, 1, 2)
        layout.addWidget(allButton, 4, 2, 1, 2)

        layout.addWidget(spacer, 5, 0)

        layout.addWidget(optionsLabel, 6, 0)

        layout.addWidget(self.caseSen,6, 1)
        layout.addWidget(self.wholeWords, 6, 2)

        self.setGeometry(300, 300, 360, 250)
        self.setWindowTitle("Find And Replace")
        self.setLayout(layout)

        self.normalRadio.setChecked(True)

    def find(self):
        text = self.parent.text.toPlainText()
        query = self.findField.toPlainText()

        if self.wholeWords.isChecked():
            query = r'\W' + query + r'\W'

        flags = 0 if self.caseSen.isChecked() else re.I
        pattern = re.compile(query, flags)
        start = self.lastMatch.start() + 1 if self.lastMatch else 0
        self.lastMatch = pattern.search(text, start)
        if self.lastMatch:
            try:
                start = self.lastMatch.start()
                end = self.lastMatch.end()
                if self.wholeWords.isChecked():
                    start += 1
                    end -=1
                self.moveCursor(start, end)
            except Exception as err:
                   print(err)

        else:
            self.parent.moveCursor(QTextCursor.End)

我希望找到的文本突出显示。我总是尝试在Find类的超级控件中进行几次更改,但都存在相同的例外。当您尝试“ type(self)”时,我得到了wrappertype类ext.find.Find插入QDialog。

1 个答案:

答案 0 :(得分:0)

我发现了自己的错误。在move方法中,我用小写的“ k”而不是大写的“ K”拼写了keepAnchor 抱歉给您带来不便!