Найти и заменить реализацию функции с помощью PyQt5 на MDI для поиска слов и строк - PullRequest
0 голосов
/ 05 апреля 2019

Я работаю в текстовом редакторе, использующем 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()

Когда я выполняю функцию поиска, программа вылетает. Функция замены работает нормально. Я также хотел бы реализовать некоторые функции подсветки здесь.

...