import sys
import os
import panel
import textedit
from PyQt5.QtCore import Qt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QColorDialog, QFontDialog, QTextEdit, QFileDialog, QMessageBox
from PyQt5.QtCore import QFile, QFileInfo
from PyQt5.QtGui import QPalette,QTextCursor
class Editor(QtWidgets.QMainWindow, panel.Ui_MainWindow):
def __init__(self, parent=None):
super(Editor, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle("Notepad")
self.actionOpen.triggered.connect(self.fileOpen)
self.actionNew.triggered.connect(self.fileNew)
self.actionSave.triggered.connect(self.fileSave)
self.actionClose.triggered.connect(self.closeEvent)
self.actionPile.triggered.connect(self.filePile)
self.actionHorizontal.triggered.connect(self.fileHorizontal)
self.actionVertical.triggered.connect(self.fileVertical)
self.actionDelete.triggered.connect(self.fileUndo)
self.actionRecover.triggered.connect(self.fileRedo)
self.actionCopy.triggered.connect(self.fileCopy)
self.actionCut.triggered.connect(self.fileCut)
self.actionPaste.triggered.connect(self.filePaste)
self.actionBold.triggered.connect(self.fileBold)
self.actionItalic.triggered.connect(self.fileItalic)
self.actionUnderline.triggered.connect(self.fileUnderline)
self.fontComboBox.currentFontChanged.connect(self.fileChangeFont)
self.actionSearch.triggered.connect(self.fileSearch)
self.actionLeft.triggered.connect(self.fileLeft)
self.actionRight.triggered.connect(self.fileRight)
self.actionFont.triggered.connect(self.fileFontBox)
self.actionColor.triggered.connect(self.fileColorBox)
def fileFontBox(self):
font, okPressed = QFontDialog.getFont()
if okPressed:
self.mdiArea.activeSubWindow().widget().setCurrentFont(font)
def fileColorBox(self):
col = QColorDialog.getColor()
if col.isValid():
self.mdiArea.activeSubWindow().widget().setTextColor(col)
def fileLeft(self):
self.mdiArea.activeSubWindow().widget().setAlignment(Qt.AlignLeft)
def fileRight(self):
self.mdiArea.activeSubWindow().widget().setAlignment(Qt.AlignRight)
def fileCenter(self):
self.mdiArea.activeSubWindow().widget().setAlignment(Qt.AlignCenter)
def fileHorizontal(self):
wList = self.mdiArea.subWindowList()
size = len(wList)
if size > 0:
position = QtCore.QPoint(0, 0)
for w in wList:
rect = QtCore.QRect(0, 0, self.mdiArea.width() / size,
self.mdiArea.height())
w.setGeometry(rect)
w.move(position)
position.setX(position.x() + w.width())
def fileVertical(self):
wList = self.mdiArea.subWindowList()
size = len(wList)
if size > 0:
position = QtCore.QPoint(0, 0)
for w in wList:
rect = QtCore.QRect(0, 0, self.mdiArea.width(),
self.mdiArea.height() / size)
w.setGeometry(rect)
w.move(position)
position.setY(position.y() + w.height())
def fileChangeFont(self, font):
self.mdiArea.activeSubWindow().widget().setCurrentFont(font)
def fileSearch(self):
pattern, okPressed = QtWidgets.QInputDialog.getText(self,
"查找", "查找字符串:", QtWidgets.QLineEdit.Normal, "")
if okPressed and pattern != '':
sub = self.mdiArea.activeSubWindow().widget()
sub.moveCursor(QTextCursor.StartOfLine, QTextCursor.MoveAnchor)
if sub.find(pattern):
palette = sub.palette()
palette.setColor(QPalette.Highlight, palette.color(QPalette.Active,QPalette.Highlight))
sub.setPalette(palette)
def fileBold(self):
sub = self.mdiArea.activeSubWindow().widget()
tmpFormat = sub.currentCharFormat()
if tmpFormat.fontWeight() == QtGui.QFont.Bold:
tmpFormat.setFontWeight(QtGui.QFont.Normal)
else:
tmpFormat.setFontWeight(QtGui.QFont.Bold)
sub.mergeCurrentCharFormat(tmpFormat)
def fileItalic(self):
tmpTextBox = self.mdiArea.activeSubWindow().widget()
tmpTextBox.setFontItalic(not tmpTextBox.fontItalic())
def fileUnderline(self):
tmpTextBox = self.mdiArea.activeSubWindow().widget()
tmpTextBox.setFontUnderline(not tmpTextBox.fontUnderline())
def fileCopy(self):
self.mdiArea.activeSubWindow().widget().copy()
def fileCut(self):
self.mdiArea.activeSubWindow().widget().cut()
def filePaste(self):
self.mdiArea.activeSubWindow().widget().paste()
def fileRedo(self):
self.mdiArea.activeSubWindow().widget().redo()
def fileUndo(self):
self.mdiArea.activeSubWindow().widget().undo()
def filePile(self):
if len(self.mdiArea.subWindowList()) > 1:
self.mdiArea.cascadeSubWindows()
def fileSave(self):
tmpTextEdit = self.mdiArea.activeSubWindow()
tmpTextEdit=tmpTextEdit.widget()
if tmpTextEdit is None or not isinstance(tmpTextEdit, QTextEdit):
return True
tmpTextEdit.save()
def fileOpen(self):
filename,filetype = QFileDialog.getOpenFileName(self,"打开文件","C:","Text files (*.txt);;HTML files (*html)")
if filename:
for window in self.mdiArea.subWindowList():
textEdit=window.widget()
if textEdit.filename == filename:
self.mdiArea.setActiveSubWindow(window)
break
else:
self.loadFile(filename)
def fileNew(self):
tmpTextEdit = textedit.TextEdit()
self.mdiArea.addSubWindow(tmpTextEdit)
tmpTextEdit.show()
def loadFile(self, filename):
tmpTextEdit = textedit.TextEdit(filename)
tmpTextEdit.load()
self.mdiArea.addSubWindow(tmpTextEdit)
tmpTextEdit.show()
def closeEvent(self, event):
unSaveFile = 0
for window in self.mdiArea.subWindowList():
textEdit = window.widget()
if textEdit.isModified():
unSaveFile += 1
if unSaveFile != 0:
dlg = QMessageBox.warning(self, "Notepad", "{0}个文档尚未保存,是否关闭?".format(unSaveFile), QMessageBox.Yes|QMessageBox.No)
if dlg == QMessageBox.Yes:
QtCore.QCoreApplication.quit()
elif dlg == QMessageBox.No:
event.ignore()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ex = Editor()
ex.show()
app.exec_()
每种语言都有自己擅长的领域,感觉C#实现会更容易一些。
在上面的代码中,我们实现了两个槽函数new_document()和close_document(),分别对应新建文档和关闭文档的动作。在new_document()函数中,我们创建了一个新的QMdiSubWindow,并设置它的标题和部件,并将其添加到QMdiArea中。该部件可以将多个子窗口放入一个主窗口中,用户可以方便地在多个文档之间切换,增强了程序的可操作性和用户体验。在上述代码中,我们创建了一个QMdiArea作为主窗口,并循环创建了三个QMdiSubWindow作为子窗口。
这和预期有点差距,我就再找有没有办法自定义tabWidget,tabText?刚刚我看到了xmind软件,可以一个软件中打开多个子窗口,点x即可关闭,我就联想到了QMdiArea,和窗口类型组合。
在initUI方法中,我们先设置了窗口的大小、标题等基本属性,然后创建了一个QTextEdit对象并将其设置为主窗口的中心小部件。还添加了一个退出菜单项。在上面的代码中,我们创建了一个名为on_text_changed的处理函数,并将其连接到文本编辑器的textChanged信号。这就是如何使用PyQt中的QTextEdit创建富文本编辑器的基础知识,它具有许多强大的功能和灵活的选项。在上面的代码中,我们首先定义了三个字符串变量,分别代表要插入的图像URL、链接的URL和文本,以及要在列表中插入的项目。
通过添加工具栏按钮,我们使用户能够选择字体样式、字号、加粗、斜体、下划线和字体颜色等。在PyQt中,富文本编辑器是一种功能强大的工具,它允许用户以富文本的形式编辑和格式化文本。富文本编辑器提供了很多常见的文本编辑功能,例如字体样式、字号、颜色、对齐方式等。本文将介绍如何在PyQt中创建一个简单的富文本编辑器,并展示一些常用的功能。方法用于创建工具栏,并添加字体选择、字号选择、加粗、斜体、下划线和颜色选择等功能。接下来,我们实现一些功能方法,以便响应工具栏按钮的点击事件。在上述代码中,我们创建了一个名为。
PyQt5_QTextEdit_多行富文
是一个高级的WYSIWYG(What You See Is What You Get 所见即所得)查看器/编辑器,支持使用HTML样式标签的富文本格式。
支持的HTML4标签子集:Supported HTML Subset | Qt GUI 5.15.13
如果不够, 可以考虑使用WebKit(Qt中专门的浏览器,可以加载HTML样式标签的富文本内容)
它经过优化,可以处理大型文档并快速响应用户输入。
适用于段落和字符(如果文本太大而无法在文本编辑的视口中查看,则
完成了什么:
一个简单的菜单栏,带有标准的“文件”和“编辑”菜单
一个TextArea小部件,用户可以在其中编写一些限制为140个字符的文本(达到限制时-StatusBar上会显示一条相对消息)
工具栏,允许用户修改选定的文本
StatusBar的其他信息,例如:。 项目名称。 一个用户。 用户输入的字符数
状态栏,显示常规消息(菜单操作悬停和140限制通知)以及一些其他信息
它可以记住M
在该类的构造函数中,创建了一个QMdiArea对象,并将其设置为主窗口的中央部件。接着,通过定义create_actions()和create_menus()方法,创建了两个菜单动作,并将它们添加到文件菜单中。在new_file()方法中,我们创建了一个新的子窗口(QTextEdit),并将其添加到QMdiArea中。通过点击菜单中的"新建"动作,可以创建一个新的子窗口;最后,在主程序的入口处创建了一个QApplication对象,并将MainWindow实例化为主窗口,并显示出来。
在构造函数中,我们创建了一个QMdiArea对象self.mdi_area,并通过setCentralWidget()方法将其设置为主窗口的中心部件。然后,我们调用create_sub_window()方法创建一个QMdiSubWindow对象,并设置其属性,最后将其添加到QMdiArea中并显示出来。在构造函数中,我们创建了一个QMdiArea对象self.mdi_area,并通过setCentralWidget()方法将其设置为主窗口的中心部件。与代码文件放置在同一目录下,以便正确设置子窗口的图标。
多文档界面(Multi Document Interface,MDI)是一种应用程序界面管理方法。MDI应用程序一般由一个主窗口和多个子窗口组成,这些子窗口在主窗口里显示,并共享主窗口的菜单栏,工具栏。在MDI应用程序中,操作对象一般是当前活动的子窗口。典型MDI应用程序
如Microsoft的Word、Excel等软件。
文章目录1. 表格与树1.1 QTableView
learn from 《PyQt5 快速开发与实战》
https://doc.qt.io/qtforpython/index.html
https://www.riverbankcomputing.com/static/Docs/PyQt5
1. 表格与树
1.1 QTableView
逻辑代码页转自作为一个使用C++开发QT五年的“老”程序猿,总觉得使用C++开发GUI,是一个很费时费力或者说没有“钱”途的事情,因为现在有大量的轻量化的编程语言可以做很绚丽的交互界面,所以笔者现在逐渐向Python转移,逐渐使用PyQt5开发Qt项目,作为一个python新手,请大家多多指教。
在运营后台,运营人员需要录入商品并编辑商品的详情信息,而商品的详情信息不是普通的文本,可以是包含了HTML语法格式的字符串。为了快速简单的让用户能够在页面中编辑带格式的文本,我们引入富文本编辑器。富文本即具备丰富样式格式的文本。我们使用功能强大的CKEditor富文本编辑器。富文本编辑器1. 安装pip install django-ckeditor2. 添加应用在INSTALLED_APPS中添...