如何在同一文本输入框中实现实时降价预览?

2024-09-27 00:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用QT设计器和Python构建一个记笔记的GUI。我正在设想用简单的标记将笔记保存为*.txt文件。但是,对于GUI,我希望主文本编辑框能够在您处于“编辑模式”并不断键入时实时呈现markdown。因此,如果您键入*italic***bold**,文本框将识别出这一点,并使用文本中的标记符号将其斜体化或加粗。一旦你退出“编辑模式”,你会看到一个格式正确的富文本预览,并且没有任何标记符号。如果有人熟悉Notable,我非常希望复制它(值得一提的是Bear应用程序,但它的功能不同,因为它始终处于“实时预览”模式)

我正试图弄清楚如何使用QT和Python实现这一点,到目前为止,我所能想到的就是:

  1. QT网站上有一个example演示了使用QWebEngineView的实时预览,但它与一个普通文本框并排,而不是我所想的

  2. 我想知道这是否也可以通过某种语法突出显示来实现?所以从这个意义上说,我应该更多地构建一个代码编辑器或其他什么?因此,QT文本框将被配置(作为富文本或HTML?我不知道),以便*(italic text)*的任何实例在您键入第二个星号时都将获得斜体格式。我想在语法突出显示定义中,我可以使用某种通配符来表示“这些标记符号之间的任何内容?”

有人对解决方案有什么建议吗


Tags: 标记文本编辑键入格式模式语法gui
1条回答
网友
1楼 · 发布于 2024-09-27 00:18:55

由于Qt 5.14 QTextEdit支持标记格式,因此可以使用2个显示不同编辑模式的QTextEdit。要交换QTextEdit,可以使用QStackedWidget:

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.stacked_widget = QtWidgets.QStackedWidget()
        self.setCentralWidget(self.stacked_widget)

        self.markdown_editor = QtWidgets.QTextEdit()
        self.markdown_viewer = QtWidgets.QTextEdit(readOnly=True)

        self.stacked_widget.addWidget(self.markdown_editor)
        self.stacked_widget.addWidget(self.markdown_viewer)

        foo_menu = self.menuBar().addMenu("&FooMenu")
        self.edit_action = foo_menu.addAction("&Edit")
        self.edit_action.setCheckable(True)
        self.edit_action.triggered.connect(self.handle_edit_mode)

    def handle_edit_mode(self):
        self.stacked_widget.setCurrentWidget(
            self.markdown_viewer
            if self.edit_action.isChecked()
            else self.markdown_editor
        )
        if self.stacked_widget.currentWidget() == self.markdown_viewer:
            self.markdown_viewer.setMarkdown(self.markdown_editor.toPlainText())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())

相关问题 更多 >

    热门问题