Python 如何在同一文本输入框中实现实时降价预览?
我正在用QT设计器和Python构建一个记笔记的GUI。我正在设想用简单的标记将笔记保存为*.txt文件。但是,对于GUI,我希望主文本编辑框能够在您处于“编辑模式”并不断键入时实时呈现markdown。因此,如果您键入了Python 如何在同一文本输入框中实现实时降价预览?,python,pyqt,Python,Pyqt,我正在用QT设计器和Python构建一个记笔记的GUI。我正在设想用简单的标记将笔记保存为*.txt文件。但是,对于GUI,我希望主文本编辑框能够在您处于“编辑模式”并不断键入时实时呈现markdown。因此,如果您键入了*斜体*或**粗体**,文本框将识别此内容,并使用文本中的标记符号将其斜体化或粗体化。一旦你退出“编辑模式”,你会看到一个格式正确的富文本预览,并且没有任何标记符号。如果有人熟悉的话,我很想复制它(值得一提的是这个应用程序,但它的功能不同,它总是处于“实时预览”模式) 我正试图
*斜体*
或**粗体**
,文本框将识别此内容,并使用文本中的标记符号将其斜体化或粗体化。一旦你退出“编辑模式”,你会看到一个格式正确的富文本预览,并且没有任何标记符号。如果有人熟悉的话,我很想复制它(值得一提的是这个应用程序,但它的功能不同,它总是处于“实时预览”模式)
我正试图弄清楚如何使用QT和Python实现这一点,到目前为止,我所能想到的就是:
QWebEngineView
进行实时预览的示例,但它与一个普通文本框并排出现,而不是我所想的
*(斜体文本)*
的任何实例都将获得斜体格式。我想在语法突出显示定义中,我可以使用某种通配符来表示“这些标记符号之间的任何内容?”
有人对解决方案有什么建议吗?因为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_())
由于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_())
嘿,你可以在文本输入中显示html!只需获取输入,用regex查找markdown并用html替换它。希望这有帮助!粗体的正则表达式:
\*\*(.*?)\*\*
和斜体:\*(.*?)\*
@Rocket-Nikita-Ah,好的。。。看起来我可以用textChanged
信号监视QTextEdit
小部件,并将其链接到函数。每次有更改时,函数都会像您所说的那样用正则表达式查找标记,然后相应地格式化它。我得再想一想,把我的头绕在它周围,但看起来这是一条路要走。谢谢!我找到了一个叫markdown的模块。你应该试试看!嘿,你可以在文本输入中显示html!只需获取输入,用regex查找markdown并用html替换它。希望这有帮助!粗体的正则表达式:\*\*(.*?)\*\*
和斜体:\*(.*?)\*
@Rocket-Nikita-Ah,好的。。。看起来我可以用textChanged
信号监视QTextEdit
小部件,并将其链接到函数。每次有更改时,函数都会像您所说的那样用正则表达式查找标记,然后相应地格式化它。我得再想一想,把我的头绕在它周围,但看起来这是一条路要走。谢谢!我找到了一个叫markdown的模块。你应该试试看!