从主窗口运行查找文本对话框,其中实际文本位于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。
答案 0 :(得分:0)
我发现了自己的错误。在move方法中,我用小写的“ k”而不是大写的“ K”拼写了keepAnchor 抱歉给您带来不便!