首页 > 解决方案 > 如何自动替换在 QtPlainTextEdit 小部件中键入的字符

问题描述

这是我第一次使用PyQt5它,它也非常好,所以我用它构建了一个类似的文本编辑器,我想用QtPlainTextEdit. 实际上我想做的就是这个网站所做的事情:lexilogos.com/keyboard/sinhala.htm

在这个网站上,他们有一个简单的文本区域,当我们输入时,它只是用僧伽罗字符替换每个英文字符,当然是以一种有意义的方式。所以我需要对 python-qt5 做同样的事情。

我的代码:

Save New Duplicate & Edit Just Text Twitter
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'design.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont
from main import Execute
import sys
#from PyQt5.Qt import Qt

class Ui_MainWindow(object):

    def selectionchange(self, index):
        return i

    def code_run(self):
        text = self.code_input.document().toPlainText()
        result, error = Execute('<stdin>', text)

        if error:
            print(error.as_string())
            self.result.setPlainText(error.as_string())

        elif result:
            if len(result.elements) == 1:
                print(repr(result.elements[0]))
                _printed_ = open('_printed_','r').read()
                if _printed_ != None or '':
                    self.result.setPlainText(_printed_)
                else:
                    self.result.setPlainText(repr(result.elements[0]))
        else:
            print(repr(result))
            if _printed_ != None or '':
                _printed_ = open('_printed_','r').read()
                self.result.setPlainTexbt(_printed_)
            else:
                self.result.setPlainText(repr(result))

    def font_sizer(self):
        size = self.font_size_increaser.value()
        self.font_size.setText(f"Font size: {size}")
        self.code_input.setFont(QFont("UN Abhya Bold",size))

    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(737, 568)
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        MainWindow.setFont(font)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        font = QtGui.QFont()

        font.setFamily("UN Abhya Bold")
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.centralwidget.setFont(font)
        self.centralwidget.setObjectName("centralwidget")

        self.run = QtWidgets.QPushButton(self.centralwidget)
        self.run.setGeometry(QtCore.QRect(20, 450, 121, 41))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setPointSize(12)
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.run.setFont(font)
        self.run.setObjectName("run")
        self.run.clicked.connect(self.code_run)

        self.font_size_increaser = QtWidgets.QSlider(self.centralwidget)
        self.font_size_increaser.setGeometry(QtCore.QRect(250, 460, 221, 19))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.font_size_increaser.setFont(font)
        self.font_size_increaser.setOrientation(QtCore.Qt.Horizontal)
        self.font_size_increaser.setObjectName("font_size_increaser")
        self.font_size_increaser.valueChanged.connect(self.font_sizer)

        self.font_size = QtWidgets.QLabel(self.centralwidget)
        self.font_size.setGeometry(QtCore.QRect(340, 440, 91, 16))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setPointSize(10)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(75)
        self.font_size.setFont(font)
        self.font_size.setObjectName("font_size")

        self.code_input = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.code_input.setGeometry(QtCore.QRect(10, 10, 461, 421))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setPointSize(15)
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.code_input.setFont(font)
        self.code_input.setObjectName("code_input")

        self.language = QtWidgets.QComboBox(self.centralwidget)
        self.language.setGeometry(QtCore.QRect(540, 450, 151, 22))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.language.setFont(font)
        self.language.setObjectName("language")
        lang = open("_languages.lang","r").read().splitlines()
        self.language.addItems(lang)
        self.language.currentIndexChanged.connect(self.selectionchange)

        self.result = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.result.setGeometry(QtCore.QRect(490, 10, 231, 421))
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setPointSize(12)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.result.setFont(font)
        self.result.setObjectName("result")

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        font = QtGui.QFont()
        font.setFamily("UN Abhya Bold")
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.statusbar.setFont(font)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.run.setText(_translate("MainWindow", "RUN"))
        self.font_size.setText(_translate("MainWindow", "Font Size"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我认为为了实现这一点,我需要不断听取输入的所有字符,首先将先前字符的副本复制到变量中,然后替换当前字符并将它们连接在一起,还是有其他方法?我不知道如何用这些小部件和所有方法做到这一点。

标签: pythonpython-3.xpyqt5python-3.8qplaintextedit

解决方案


一种可能的解决方案是修改 QKeyEvent:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent
from PyQt5.QtWidgets import QApplication, QPlainTextEdit


KEYS_MAPPING = {
    "a": "අ&quot;,
    "b": "බ්",
    "c": "දෙ",
    "d": "ෆ්",
    "e": "ග්",
    "f": "ෆ්",
    "g": "ඝි",
    "h": "ජ්",
    "i": "ක්",
}


class TextEdit(QPlainTextEdit):
    def keyPressEvent(self, event):
        event = self.change_letter(event)
        super().keyPressEvent(event)

    def change_letter(self, event):
        text = KEYS_MAPPING.get(event.text())
        if text is None:
            return event
        return QKeyEvent(event.type(), Qt.Key_unknown, event.modifiers(), text)


def main():
    app = QApplication(sys.argv)
    text_edit = TextEdit()
    text_edit.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

推荐阅读