Я работаю в текстовом редакторе, использующем PyQt5, и использую Multiple Document Interface. Я застрял в реализации функции поиска и замены для поиска слов в текстовом редакторе и перехода к строкам. Мне удалось поработать над интерфейсом нескольких документов. Мне нужно реализовать эту функцию в моем программном обеспечении, используя виджет QDockWidget или QDilalog.
Мне удалось открыть виджет-док и диалоговые окна, и даже мне удалось заменить все функции, но функция поиска не работает.
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
f = ""
cs = False
ww = False
class GraphyChild(QTextEdit):
sequenceNumber = 1
def __init__(self):
super(GraphyChild, self).__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
self.isUntitled = True
font = QFont("Arial", 11)
self.setFont(font)
def Find(self):
global f
find = Find()
find.show()
def handleFind():
f = find.searchText.toPlainText()
print(f)
if cs == True and ww == False:
flag = QTextDocument.FindBackward and
QTextDocument.FindCaseSensitively
elif cs == False and ww == False:
flag = QTextDocument.FindBackward
elif cs == False and ww == True:
flag = QTextDocument.FindBackward and
TextDocument.FindWholeWords
elif cs == True and ww == True:
flag = QTextDocument.FindBackward and
QTextDocument.FindCaseSensitively and
QTextDocument.FindWholeWords
self.find(f, flag)
def handleReplace():
f = find.searchText.toPlainText()
r = find.replaceText.toPlainText()
text = self.toHtml()
newText = text.replace(f, r)
self.clear()
self.append(newText)
find.searchButton.clicked.connect(handleFind)
find.replaceButton.clicked.connect(handleReplace)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.mdiArea = QMdiArea()
self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
self.setCentralWidget(self.mdiArea)
self.mdiArea.subWindowActivated.connect(self.updateMenus)
self.windowMapper = QSignalMapper(self)
self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)
def find_window(self):
if self.activeGraphyChild():
self.activeGraphyChild().Find()
def createActions(self):
self.findAct = QAction(QIcon(':/image/search (2).png'), "&Find", self,
shortcut=QKeySequence.Find,
statusTip="Find Text",
triggered=self.find_window)
class Find(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.initUI()
def initUI(self):
self.lb1 = QLabel("Search For:", self)
self.lb1.setStyleSheet("font-size: 15px")
self.lb1.move(10,10)
self.searchText = QTextEdit(self)
self.searchText.move(10, 40)
self.searchText.resize(250, 40)
self.searchButton = QPushButton("Find", self)
self.searchButton.move(270, 40)
self.lb2 = QLabel("Replace All With:", self)
self.lb2.setStyleSheet("font-size: 15px")
self.lb2.move(10, 80)
self.replaceText = QTextEdit(self)
self.replaceText.move(10, 110)
self.replaceText.resize(250, 25)
self.replaceButton = QPushButton("Replace", self)
self.replaceButton.move(270, 110)
self.csCheckBox = QCheckBox("Case Sensitive", self)
self.csCheckBox.move(10, 160)
self.csCheckBox.stateChanged.connect(self.caseSensitive)
self.wholeCheckBox = QCheckBox("Whole Words", self)
self.wholeCheckBox.move(10, 190)
self.wholeCheckBox.stateChanged.connect(self.wholeWords)
self.close = QPushButton("Close", self)
self.close.move(270, 220)
self.close.clicked.connect(self.Close)
def caseSensitive(self, state):
global cs
if state == QtCore.Qt.Checked:
cs = True
else:
cs = False
def wholeWords(self, state):
global ww
print(ww)
if state == QtCore.Qt.Checked:
ww = True
else:
ww = False
def Close(self):
self.hide()
Когда я выполняю функцию поиска, программа вылетает. Функция замены работает нормально. Я также хотел бы реализовать некоторые функции подсветки здесь.