def updateMimeData( self, hasColor, color, hasHtml, html, hasImage, image, hasText, text, hasUrls, urls, hasFiles, files, ): # 客户端剪切板同步到服务端 self.append('收到客户端发送的剪贴板') clipboard = QApplication.clipboard() clipboard.blockSignals(True) data = QMimeData() if hasColor: data.setColorData(color) if hasHtml: data.setHtml(html) if hasImage: data.setImageData(image) if hasText: data.setText(text) # if hasUrls: # data.setUrls(urls) if hasFiles: data.setData('') clipboard.setMimeData(data) clipboard.blockSignals(False)
def copy_html(self): print(self) mime_data = QMimeData() mime_data.setHtml('<b>Bold and <font color=red>Red</font></b>') clipboard = QApplication.clipboard() clipboard.setHtml(mime_data) pass
def startDrag(self, event): """ Override startDrag method to display custom icon """ # Get image of selected item selected = self.selectedIndexes() # Start drag operation drag = QDrag(self) drag.setMimeData(self.model.mimeData(selected)) icon = self.model.data(selected[0], Qt.DecorationRole) drag.setPixmap( icon.pixmap(QSize(self.drag_item_size, self.drag_item_size))) drag.setHotSpot( QPoint(self.drag_item_size / 2, self.drag_item_size / 2)) # Create emoji file before drag starts data = json.loads(drag.mimeData().text()) file = self.add_file(data[0]) # Update mimedata for emoji data = QMimeData() data.setText(json.dumps([file.id])) data.setHtml("clip") drag.setMimeData(data) # Start drag drag.exec_()
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Create list from requested transition indexes items = [i.sibling(i.row(), 3).data() for i in indexes] data.setText(json.dumps(items)) data.setHtml("transition") # Return Mimedata return data
def clipboard_copy(self): print('Копируем в буфер обмена') clipboard_data = self.work_info_model.copy() if len(clipboard_data) == 0: return mime_data = QMimeData() mime_data.setText(clipboard_data) mime_data.setHtml(clipboard_data) self.app.clipboard().setMimeData(mime_data)
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Get list of class names for requested effect indexes items = [i.sibling(i.row(), 4).data() for i in indexes] data.setText(json.dumps(items)) data.setHtml("effect") # Return Mimedata return data
def _copy_results_current(self, grid): """Copy cell results for the current cell""" current = grid.current data = grid.model.code_array[current] if data is None: return clipboard = QApplication.clipboard() # Get renderer for current cell renderer = grid.model.code_array.cell_attributes[current]["renderer"] if renderer == "text": clipboard.setText(repr(data)) elif renderer == "image": if isinstance(data, BasicQImage): clipboard.setImage(data) else: # We may have an svg image here try: svg_bytes = bytes(data) except TypeError: svg_bytes = bytes(data, encoding='utf-8') if is_svg(svg_bytes): mime_data = QMimeData() mime_data.setData("image/svg+xml", svg_bytes) clipboard.setMimeData(mime_data) elif renderer == "markup": mime_data = QMimeData() mime_data.setHtml(str(data)) # Also copy data as plain text doc = QTextDocument() doc.setHtml(str(data)) mime_data.setText(doc.toPlainText()) clipboard.setMimeData(mime_data) elif renderer == "matplotlib" and isinstance(data, matplotlib_figure.Figure): # We copy and svg to the clipboard svg_filelike = io.BytesIO() png_filelike = io.BytesIO() data.savefig(svg_filelike, format="svg") data.savefig(png_filelike, format="png") svg_bytes = (svg_filelike.getvalue()) png_image = QImage().fromData(png_filelike.getvalue()) mime_data = QMimeData() mime_data.setData("image/svg+xml", svg_bytes) mime_data.setImageData(png_image) clipboard.setMimeData(mime_data)
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Get list of all selected file ids ids = self.parent.selected_file_ids() data.setText(json.dumps(ids)) data.setHtml("clip") # Return Mimedata return data
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Get list of all selected file ids files = [ self.itemFromIndex(i).data(TitleRoles.PathRole) for i in indexes ] data.setText(json.dumps(files)) data.setHtml("title") # Return Mimedata return data
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Get list of all selected file ids files = [] for item in indexes: selected_row = self.itemFromIndex(item).row() files.append(self.item(selected_row, 4).text()) data.setText(json.dumps(files)) data.setHtml("effect") # Return Mimedata return data
def mimeData(self, indexes): # Create MimeData for drag operation data = QMimeData() # Get list of all selected file ids files = [] for item in indexes: selected_row = self.itemFromIndex(item).row() files.append(self.item(selected_row, 2).text()) data.setText(json.dumps(files)) data.setHtml("title") # Return Mimedata return data
def updateMimeData(self, hasColor, color, hasHtml, html, hasImage, image, hasText, text, hasUrls, urls): # 远程的剪贴板同步到客户端 clipboard = QApplication.clipboard() clipboard.blockSignals(True) data = QMimeData() if hasColor: data.setColorData(color) if hasHtml: data.setHtml(html) if hasImage: data.setImageData(image) if hasText: data.setText(text) if hasUrls: data.setUrls(urls) clipboard.setMimeData(data) clipboard.blockSignals(False)
def export_to_clipboard(self): bounds = self.__get_bounds() size = self.get_size(bounds) output = QPixmap(size) output.fill(Qt.transparent) self.__draw(bounds, output) clipboard_data = QMimeData() clipboard_data.setImageData(output) if self.__transparent: image_data = QByteArray() image_buffer = QBuffer(image_data) output.save(image_buffer, 'PNG') image_base64 = base64.b64encode(bytes(image_data)).decode('ascii') clipboard_data.setHtml( '<img src="data:image/png;base64,{0}">'.format(image_base64)) QApplication.clipboard().setMimeData(clipboard_data)
def copyColoredHtml(self): cursor = self.textCursor() if not cursor.hasSelection(): return s = QSettings() s.beginGroup("source_export") number_lines = s.value("number_lines", False, bool) inline_style = s.value("inline_copy", True, bool) as_plain_text = s.value("copy_html_as_plain_text", False, bool) wrap_tag = s.value("wrap_tag", "pre", str) wrap_attrib = s.value("wrap_attrib", "id", str) wrap_attrib_name = s.value("wrap_attrib_name", "document", str) document_body_only = s.value("copy_document_body_only", False, bool) import highlight2html html = highlight2html.html_inline(cursor, inline=inline_style, number_lines=number_lines, full_html=not document_body_only, wrap_tag=wrap_tag, wrap_attrib=wrap_attrib, wrap_attrib_name=wrap_attrib_name) data = QMimeData() data.setText(html) if as_plain_text else data.setHtml(html) QApplication.clipboard().setMimeData(data)
def copyColoredHtml(self): cursor = self.textCursor() if not cursor.hasSelection(): return s = QSettings() s.beginGroup("source_export") number_lines = s.value("number_lines", False, bool) inline_style = s.value("inline_copy", True, bool) as_plain_text = s.value("copy_html_as_plain_text", False, bool) wrap_tag = s.value("wrap_tag", "pre", str) wrap_attrib = s.value("wrap_attrib", "id", str) wrap_attrib_name = s.value("wrap_attrib_name", "document", str) document_body_only = s.value("copy_document_body_only", False, bool) import highlight2html html = highlight2html.html_inline(cursor, inline=inline_style, number_lines=number_lines, full_html=not document_body_only, wrap_tag=wrap_tag, wrap_attrib=wrap_attrib, wrap_attrib_name=wrap_attrib_name) data = QMimeData() data.setText(html) if as_plain_text else data.setHtml(html) QApplication.clipboard().setMimeData(data)
def CopyAsHtml(tableName, table): # table = QtWidgets.QTableWidget() hdrColors = ['"lightcyan"', '"aqua"'] # 1st for player, 2nd for scores fontColors = [ [ '"#000000"', '"#000000"', ], # player font is black ['"#ffff99"', '"#ffffff"'] ] # score font is black or dark red BgColors = [ ['"#ffffff"', '"#e0e0e0"'], # player bg is white ['"#ffff99"', '"#ffffff"'] ] # score alternate every 4 rows: yellowish, white intros = [playerIntro, scoreIntro] tType = 0 if 'score' in tableName: tType = 1 html = intros[tType] html += '<tbody><tr bgcolor=' + hdrColors[tType] + '>' # column headers plainText = '' for col in range(1, table.columnCount()): name = table.horizontalHeaderItem(col).text() html += '<th>' + name + '</th>' plainText += name + ',' html += '</tr>' plainText = plainText[:-1] # remove last ',' # table rows for row in range(table.rowCount()): if tType == 1: # score table irow = (row // 4) % 2 html += '<tr bgcolor=' + BgColors[tType][ irow] + '; ' + 'font color=' + fontColors[tType][irow] + '>' else: # hilite alternate rows irow = row % 2 html += '<tr bgcolor=' + BgColors[tType][ irow] + '; ' + 'font color=' + fontColors[tType][irow] + '>' for col in range(1, table.columnCount()): name = table.item(row, col).text() html += '<td>' + name + '</td>' plainText += name + ',' html += '</tr>' plainText = plainText[:-1] + '\n' html += '</tbody></table></body></html>' mimeData = QMimeData() mimeData.setHtml(html) mimeData.setText(plainText) clipboard = QApplication.clipboard() clipboard.setMimeData(mimeData)
def copy_html(self): mime_data = QMimeData() mime_data.setHtml('<b>Bold and <font color=red>Red</font></b>') self.clip_board.setMimeData(mime_data) print(1)
def copyHtml(self): mimeData = QMimeData() mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>") clipboard = QApplication.clipboard() clipboard.setMimeData(mimeData)
def copy_html(self): mime_data = QMimeData() mime_data.setHtml( "<b> Bold and <span style='color: red;'>Red</span></b>") clipboard = QApplication.clipboard() clipboard.setMimeData(mime_data) # 将html文本设置入剪贴板
def copyHtml(self): # QApplication.clipboard() 返回对剪切板对象的引用 mimeData = QMimeData() mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>") clipboard = QApplication.clipboard() clipboard.setMimeData(mimeData)
class Demo(QMainWindow): is_saved = True is_saved_first = True path = '' def __init__(self): super(Demo, self).__init__() self.file_menu = self.menuBar().addMenu('File') self.edit_menu = self.menuBar().addMenu('Edit') self.help_menu = self.menuBar().addMenu('Help') self.file_toolbar = self.addToolBar('File') self.edit_toolbar = self.addToolBar('Edit') self.status_bar = self.statusBar() self.new_action = QAction('New', self) self.open_action = QAction('Open', self) self.save_action = QAction('Save', self) self.save_as_action = QAction('Save As', self) self.close_action = QAction('Close', self) self.cut_action = QAction('Cut', self) self.copy_action = QAction('Copy', self) self.paste_action = QAction('Paste', self) self.font_action = QAction('Font', self) self.color_action = QAction('Color', self) self.about_action = QAction('Qt', self) self.text_edit = QTextEdit(self) self.mime_data = QMimeData() self.clipboard = QApplication.clipboard() self.setCentralWidget(self.text_edit) self.resize(450, 600) self.menu_init() self.toolbar_init() self.status_bar_init() self.action_init() self.text_edit_int() def menu_init(self): self.file_menu.addAction(self.new_action) self.file_menu.addAction(self.open_action) self.file_menu.addAction(self.save_action) self.file_menu.addAction(self.save_as_action) self.file_menu.addSeparator() self.file_menu.addAction(self.close_action) self.edit_menu.addAction(self.cut_action) self.edit_menu.addAction(self.copy_action) self.edit_menu.addAction(self.paste_action) self.edit_menu.addSeparator() self.edit_menu.addAction(self.font_action) self.edit_menu.addAction(self.color_action) self.help_menu.addAction(self.about_action) def toolbar_init(self): self.file_toolbar.addAction(self.new_action) self.file_toolbar.addAction(self.open_action) self.file_toolbar.addAction(self.save_action) self.file_toolbar.addAction(self.save_as_action) self.edit_toolbar.addAction(self.cut_action) self.edit_toolbar.addAction(self.copy_action) self.edit_toolbar.addAction(self.paste_action) self.edit_toolbar.addAction(self.font_action) self.edit_toolbar.addAction(self.color_action) def status_bar_init(self): self.status_bar.showMessage('Ready to compose') def action_init(self): self.new_action.setIcon(QIcon('images/new.ico')) self.new_action.setShortcut('Ctrl+N') self.new_action.setToolTip('Create a new file') self.new_action.setStatusTip('Create a new file') self.new_action.triggered.connect(self.new_func) self.open_action.setIcon(QIcon('images/open.ico')) self.open_action.setShortcut('Ctrl+O') self.open_action.setToolTip('Open an existing file') self.open_action.setStatusTip('Open an existing file') self.open_action.triggered.connect(self.open_file_func) self.save_action.setIcon(QIcon('images/save.ico')) self.save_action.setShortcut('Ctrl+S') self.save_action.setToolTip('Save the file') self.save_action.setStatusTip('Save the file') self.save_action.triggered.connect( lambda: self.save_func(self.text_edit.toHtml())) self.save_as_action.setIcon(QIcon('images/save_as.ico')) self.save_as_action.setShortcut('Ctrl+A') self.save_as_action.setToolTip('Save the file to a specified location') self.save_as_action.setStatusTip( 'Save the file to a specified location') self.save_as_action.triggered.connect( lambda: self.save_as_func(self.text_edit.toHtml())) self.close_action.setIcon(QIcon('images/close.ico')) self.close_action.setShortcut('Ctrl+E') self.close_action.setToolTip('Close the window') self.close_action.setStatusTip('Close the window') self.close_action.triggered.connect(self.close_func) self.cut_action.setIcon(QIcon('images/cut.ico')) self.cut_action.setShortcut('Ctrl+X') self.cut_action.setToolTip('Cut the text to clipboard') self.cut_action.setStatusTip('Cut the text') self.cut_action.triggered.connect(self.cut_func) self.copy_action.setIcon(QIcon('images/copy.ico')) self.copy_action.setShortcut('Ctrl+C') self.copy_action.setToolTip('Copy the text') self.copy_action.setStatusTip('Copy the text') self.copy_action.triggered.connect(self.copy_func) self.paste_action.setIcon(QIcon('images/paste.ico')) self.paste_action.setShortcut('Ctrl+V') self.paste_action.setToolTip('Paste the text') self.paste_action.setStatusTip('Paste the text') self.paste_action.triggered.connect(self.paste_func) self.font_action.setIcon(QIcon('images/font.ico')) self.font_action.setShortcut('Ctrl+T') self.font_action.setToolTip('Change the font') self.font_action.setStatusTip('Change the font') self.font_action.triggered.connect(self.font_func) self.color_action.setIcon(QIcon('images/color.ico')) self.color_action.setShortcut('Ctrl+R') self.color_action.setToolTip('Change the color') self.color_action.setStatusTip('Change the color') self.color_action.triggered.connect(self.color_func) self.about_action.setIcon(QIcon('images/about.ico')) self.about_action.setShortcut('Ctrl+Q') self.about_action.setToolTip('What is Qt?') self.about_action.setStatusTip('What is Qt?') self.about_action.triggered.connect(self.about_func) def text_edit_int(self): self.text_edit.textChanged.connect(self.text_changed_func) def text_changed_func(self): if self.text_edit.toPlainText(): self.is_saved = False else: self.is_saved = True def new_func(self): if not self.is_saved: choice = QMessageBox.question( self, '', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func() self.text_edit.clear() elif choice == QMessageBox.No: self.text_edit.clear() else: pass else: self.text_edit.clear() def open_file_func(self): if not self.is_saved: choice = QMessageBox.question( self, '', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func() file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True elif choice == QMessageBox.No: file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True else: pass else: file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True def save_func(self, text): if self.is_saved_first: self.save_as_func(text) else: with open(self.path, 'w') as f: f.write(text) self.is_saved = True def save_as_func(self, text): self.path, _ = QFileDialog.getSaveFileName( self, 'Save File', './', 'Files (*.html *.txt *.log)') if self.path: with open(self.path, 'w') as f: f.write(text) self.is_saved = True self.is_saved_first = False def close_func(self): if not self.is_saved: choice = QMessageBox.question( self, 'Save File', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) self.close() elif choice == QMessageBox.No: self.close() else: pass def closeEvent(self, QCloseEvent): if not self.is_saved: choice = QMessageBox.question( self, 'Save File', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) QCloseEvent.accept() elif choice == QMessageBox.No: QCloseEvent.accept() else: QCloseEvent.ignore() def cut_func(self): self.mime_data.setHtml( self.text_edit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) self.text_edit.textCursor().removeSelectedText() def copy_func(self): self.mime_data.setHtml( self.text_edit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) def paste_func(self): self.text_edit.insertHtml(self.clipboard.mimeData().html()) def font_func(self): font, ok = QFontDialog.getFont() if ok: self.text_edit.setFont(font) def color_func(self): color = QColorDialog.getColor() if color.isValid(): self.text_edit.setTextColor(color) def about_func(self): QMessageBox.aboutQt(self, 'About Qt')
class Demo(QMainWindow): is_saved = True is_saved_first = True path = "" def __init__(self): super(Demo, self).__init__() # 添加菜单栏、工具栏和状态栏: self.file_menu = self.menuBar().addMenu('File') self.edit_menu = self.menuBar().addMenu('Edit') self.help_menu = self.menuBar().addMenu("Help") self.file_toolbar = self.addToolBar('File') self.edit_toolbar = self.addToolBar('Edit') self.status_bar = self.statusBar() # 将一个动作看作一种命令,每当用户点击某个动作时,就会触发某种命令,程序从而执行相应的命令。那现在我们就要实例化几个动作 self.new_action = QAction('New', self) self.open_action = QAction('OPen', self) self.save_action = QAction('Save', self) self.save_as_action = QAction('Save As', self) self.close_action = QAction('Close', self) self.cut_action = QAction('Cut', self) self.copy_action = QAction('Copy', self) self.paste_action = QAction('Paste', self) # 字体修改 self.font_action = QAction('Font', self) # 颜色修改 self.color_action = QAction('Color', self) self.about_action = QAction('Qt', self) self.about_author = QAction('备注', self) # 实例化一个QTextEdit控件 self.text_edit = QTextEdit(self) # 剪切复制粘贴功能 ==> QMimeData类 self.mime_data = QMimeData() self.clipboard = QApplication.clipboard() """ 调用QMainWindow的setCentralWidget()方法可以设置主窗口的中央控件, 这里我们将文本编辑框text_edit设置为中央控件。调用resize()方法将窗口设置到合适的大小 """ self.setCentralWidget(self.text_edit) self.resize(450, 600) self.menu_init() self.toolbar_init() self.status_bar_init() self.action_init() self.text_edit_int() # 将相应的动作添加到了菜单栏 def menu_init(self): # addSeparator()方法顾名思义就是加一个分割条 # 调用addAction()方法就可以将动作添加进去 self.file_menu.addAction(self.new_action) self.file_menu.addAction(self.open_action) self.file_menu.addAction(self.save_action) self.file_menu.addAction(self.save_as_action) self.file_menu.addSeparator() self.file_menu.addAction(self.close_action) self.edit_menu.addAction(self.cut_action) self.edit_menu.addAction(self.copy_action) self.edit_menu.addAction(self.paste_action) self.edit_menu.addSeparator() self.edit_menu.addAction(self.font_action) self.edit_menu.addAction(self.color_action) self.help_menu.addAction(self.about_action) self.help_menu.addAction(self.about_author) def toolbar_init(self): self.file_toolbar.addAction(self.new_action) self.file_toolbar.addAction(self.open_action) self.file_toolbar.addAction(self.save_action) self.file_toolbar.addAction(self.save_as_action) self.edit_toolbar.addAction(self.cut_action) self.edit_toolbar.addAction(self.copy_action) self.edit_toolbar.addAction(self.paste_action) self.edit_toolbar.addAction(self.font_action) self.edit_toolbar.addAction(self.color_action) # 状态栏 def status_bar_init(self): self.status_bar.showMessage('Ready to compose') # action_init()中设置动作 # setToolTip()方法可以用来设置小气泡提示,当鼠标停留在该动作上时,就会显示相应的提示(当然我们也可以对其他对象使用该方法,比如QPushButton)。 # setStatusTip()就是设置状态栏信息 # 将new_action的triggered信号与自定义的槽函数连接起来 def action_init(self): self.new_action.setIcon(QIcon('images/new.ico')) self.new_action.setShortcut('Ctrl+N') self.new_action.setToolTip('Create a new file') self.new_action.setStatusTip('Create a new file') self.new_action.triggered.connect(self.new_func) self.open_action.setIcon(QIcon('images/open.ico')) # 2 self.open_action.setShortcut('Ctrl+O') self.open_action.setToolTip('Open an existing file') self.open_action.setStatusTip('Open an existing file') self.open_action.triggered.connect(self.open_file_func) self.save_action.setIcon(QIcon('images/save.ico')) # 3 self.save_action.setShortcut('Ctrl+S') self.save_action.setToolTip('Save the file') self.save_action.setStatusTip('Save the file') self.save_action.triggered.connect( lambda: self.save_func(self.text_edit.toHtml())) self.save_as_action.setIcon(QIcon('images/save_as.ico')) # 4 self.save_as_action.setShortcut('Ctrl+A') self.save_as_action.setToolTip('Save the file to a specified location') self.save_as_action.setStatusTip( 'Save the file to a specified location') self.save_as_action.triggered.connect( lambda: self.save_as_func(self.text_edit.toHtml())) self.close_action.setIcon(QIcon('images/close.ico')) # 5 self.close_action.setShortcut('Ctrl+E') self.close_action.setToolTip('Close the window') self.close_action.setStatusTip('Close the window') self.close_action.triggered.connect(self.close_func) self.cut_action.setIcon(QIcon('images/cut.ico')) # 6 self.cut_action.setShortcut('Ctrl+X') self.cut_action.setToolTip('Cut the text to clipboard') self.cut_action.setStatusTip('Cut the text') self.cut_action.triggered.connect(self.cut_func) self.copy_action.setIcon(QIcon('images/copy.ico')) # 7 self.copy_action.setShortcut('Ctrl+C') self.copy_action.setToolTip('Copy the text') self.copy_action.setStatusTip('Copy the text') self.copy_action.triggered.connect(self.copy_func) self.paste_action.setIcon(QIcon('images/paste.ico')) # 8 self.paste_action.setShortcut('Ctrl+V') self.paste_action.setToolTip('Paste the text') self.paste_action.setStatusTip('Paste the text') self.paste_action.triggered.connect(self.paste_func) self.font_action.setIcon(QIcon('images/font.ico')) # 9 self.font_action.setShortcut('Ctrl+T') self.font_action.setToolTip('Change the font') self.font_action.setStatusTip('Change the font') self.font_action.triggered.connect(self.font_func) self.color_action.setIcon(QIcon('images/color.ico')) # 10 self.color_action.setShortcut('Ctrl+R') self.color_action.setToolTip('Change the color') self.color_action.setStatusTip('Change the color') self.color_action.triggered.connect(self.color_func) self.about_action.setIcon(QIcon('images/about.ico')) # 11 self.about_action.setShortcut('Ctrl+Q') self.about_action.setToolTip('What is Qt?') self.about_action.setStatusTip('What is Qt?') self.about_action.triggered.connect(self.about_func) self.about_author.setIcon(QIcon('images/author.ico')) self.about_action.setShortcut('Ctrl+A') self.about_author.setToolTip('备注信息') self.about_author.setStatusTip('备注信息') self.about_author.triggered.connect(self.about_author_func) # 创建新的文件 """ 判断当前文本是否有保存,如果没有的话, 那就出现弹框询问是否要保存, 按Yes的话就调用save_func()函数进行保存 保存好了当然要将当前的文本编辑框清空 若按No不进行保存的话,就直接清空 若按下Cancel取消的话,则不进行任何动 """ def new_func(self): # QPlainTextEdit 多行简单文本框用toPlainText() if not self.is_saved and self.text_edit.toPlainText(): choice = QMessageBox.Question( self, '', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) self.text_edit.clear() self.is_saved_first = True elif choice == QMessageBox.No: self.text_edit.clear() else: pass else: self.text_edit.clear() self.is_saved = False self.is_saved_first = True def open_file_func(self): if not self.is_saved: choice = QMessageBox.question( self, '', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log *.md)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True elif choice == QMessageBox.No: file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log *.md)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True else: pass else: file, _ = QFileDialog.getOpenFileName( self, 'Open File', './', 'Files (*.html *.txt *.log *.md)') if file: with open(file, 'r') as f: self.text_edit.clear() self.text_edit.setText(f.read()) self.is_saved = True def save_func(self, text): if self.is_saved_first: self.save_as_func(text) else: with open(self.path, 'w') as f: f.write(text) self.is_saved = True def save_as_func(self, text): self.path, _ = QFileDialog.getSaveFileName( self, 'Save File', './', 'Files (*.html *.txt *.log *.md)') if self.path: with open(self.path, 'w') as f: f.write(text) self.is_saved = True self.is_saved_first = False # QCloseEvent.accept()换成了self.close()。QCloseEvent.ignoret()其实功能上就相当于pass def close_func(self): if not self.is_saved: choice = QMessageBox.question( self, 'Save File', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) self.close() elif choice == QMessageBox.No: self.close() else: pass # 关闭该软件 def closeEvent(self, QCloseEvent): if not self.is_saved: choice = QMessageBox.question( self, 'Save File', 'Do you want to save the text?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.save_func(self.text_edit.toHtml()) QCloseEvent.accept() elif choice == QMessageBox.No: QCloseEvent.accept() else: QCloseEvent.ignore() # 颜色 """ 记事本涉及到颜色,所以不能调用QTextEdit的toPlainText()方法, 因为该方法获取的是纯文本, 所以颜色会丢失掉。应该要调用toHtml()方法保留颜色; """ # self.text_edit.textCursor()方法可以获取到文本编辑框当前的指针(类型为QTextCursor) # 调用selection()方法可以获取到指针当前所选择的内容 # 我们需要再调用toHtml()方法来获取到文本内容 # 当用户进行剪切后,被剪切的文本肯定要消失, # 所以就调用QTextCursor的removeSelectedText()方法 def cut_func(self): self.mime_data.setHtml( self.text_edit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) self.text_edit.textCursor().removeSelectedText() # copy_action的槽函数如下,方法同理,只不过此时不需要将文本删除: def copy_func(self): self.mime_data.setHtml( self.text_edit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) # 在paste_action的槽函数中,我们只需要调用insetHtml()方法将剪贴板中的文本插入即可 def paste_func(self): self.text_edit.insertHtml(self.clipboard.mimeData().html()) # font_action和color_action的槽函数 def font_func(self): font, ok = QFontDialog.getFont() if ok: self.text_edit.setFont(font) def color_func(self): color = QColorDialog.getColor() if color.isValid(): self.text_edit.setTextColor(color) # about_action所连接的槽函数最为简单,就是打开一个关于Qt的消息框即可 def about_func(self): QMessageBox.aboutQt(self, 'About Qt') def about_author_func(self): QMessageBox.information(self, '备注:', '作者:红橙', QMessageBox.Cancel) # 2 def text_edit_int(self): self.text_edit.textChanged.connect(self.text_changed_func) def text_changed_func(self): if self.text_edit.toPlainText(): self.is_saved = False else: self.is_saved = True
class Editor(QMainWindow, editorUI.Ui_MainWindow): def __init__(self): super(Editor, self).__init__() self.setupUi(self) # 将textEdit设置为窗口的中心部件 self.setCentralWidget(self.textEdit) # 定义判断文本是否已经保存,是否是第一次保存的变量以及文件保存路径 self.is_saved = True self.is_first_saved = True self.filepath = "" # 剪贴板以及QMimeData类 self.mime_data = QMimeData() self.clipboard = QApplication.clipboard() assert isinstance(self.clipboard, QClipboard) # 程序打开时状态栏要显示的状态 self.statusbar.showMessage("Ready to Compose") self.filenew.triggered.connect(self.newfile) self.fileopen.triggered.connect(self.openfile) self.filesave.triggered.connect( lambda: self.savefile(self.textEdit.toHtml())) self.othersave.triggered.connect( lambda: self.saveAsfile(self.textEdit.toHtml())) self.close_action.triggered.connect(self.close_func) self.copy_action.triggered.connect(self.copy_func) self.cut_action.triggered.connect(self.cut_func) self.paste_action.triggered.connect(self.paste_func) self.font_action.triggered.connect(self.font_func) self.color_action.triggered.connect(self.color_func) self.aboutQt_action.triggered.connect(self.about_func) self.textEdit.textChanged.connect(self.change_func) def change_func(self): # if self.textEdit.toPlainText(): # self.is_saved = False # else: # self.is_saved = True self.is_saved = False def newfile(self): # 新建前我们要判断当前文本是否有保存 if not self.is_saved: choice = QMessageBox.question( self, "保存", "您想要保存当前文件吗?", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.savefile(self.textEdit.toHtml()) self.textEdit.clear() elif choice == QMessageBox.No: self.textEdit.clear() else: pass else: self.textEdit.clear() self.is_saved = True self.is_first_saved = True pass def openfile(self): # 打开新文件前我们要判断当前文本是否有保存 if not self.is_saved: choice = QMessageBox.question( self, "保存", "您想要保存当前文件吗?", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.savefile(self.textEdit.toHtml()) self.filepath, ok = QFileDialog.getOpenFileName( self, '打开文件', './', "Files(*.html *.txt *.log)") if ok and self.filepath: with open(self.filepath, 'r') as f: self.textEdit.setText(f.read()) self.is_saved = True self.is_first_saved = False elif choice == QMessageBox.No: self.filepath, ok = QFileDialog.getOpenFileName( self, '打开文件', './', "Files(*.html *.txt *.log)") if ok and self.filepath: with open(self.filepath, 'r') as f: self.textEdit.setText(f.read()) self.is_saved = True self.is_first_saved = False else: pass else: self.filepath, ok = QFileDialog.getOpenFileName( self, '打开文件', './', "Files(*.html *.txt *.log)") if ok and self.filepath: with open(self.filepath, 'r') as f: self.textEdit.setText(f.read()) self.is_saved = True self.is_first_saved = False pass def savefile(self, text): if self.is_first_saved: self.saveAsfile(text) else: try: with open(self.filepath, 'w') as f: f.write(text) self.is_saved = True except OSError as e: print(e.strerror) pass def saveAsfile(self, text): self.filepath, ok = QFileDialog.getSaveFileName( self, '保存文件', './', "Files(*.txt *.html *.log)") if ok and self.filepath: with open(self.filepath, 'w') as f: f.write(text) self.is_saved = True self.is_first_saved = False pass def close_func(self): if not self.is_saved: choice = QMessageBox.question( self, '关闭', "您将要退出,是否保存当前文件", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.savefile(self.textEdit.toHtml()) self.close() elif choice == QMessageBox.No: self.close() else: pass else: self.close() pass def copy_func(self): # 由于我们的记事本涉及到颜色,所以不能调用QTextEdit的toPlainText()方法,因为该方法获取的是纯文本, # 所以颜色会丢失掉。应该要调用toHtml()方法保留颜色; # self.text_edit.textCursor()方法可以获取到文本编辑框当前的指针(类型为QTextCursor), # 此时再调用selection()方法可以获取到指针当前所选择的内容,但此时的类型为QTextDocumentFragment, # 我们需要再调用toHtml()方法来获取到文本内容。 self.mime_data.setHtml(self.textEdit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) pass def cut_func(self): self.mime_data.setHtml(self.textEdit.textCursor().selection().toHtml()) self.clipboard.setMimeData(self.mime_data) self.textEdit.textCursor().removeSelectedText() # 移除文本 pass def paste_func(self): # insetHtml()将剪贴板中的文本插入(该方法会在指针位置插入文本) assert isinstance(self.clipboard, QClipboard) if self.clipboard.mimeData().hasHtml(): self.textEdit.insertHtml(self.clipboard.mimeData().html()) pass def font_func(self): font, ok = QFontDialog().getFont() if ok: self.textEdit.setFont(font) pass def color_func(self): color = QColorDialog().getColor() assert isinstance(color, QColor) if color.isValid(): self.textEdit.setTextColor(color) pass def about_func(self): QMessageBox.aboutQt(self, 'About Qt') pass def closeEvent(self, e): if not self.is_saved: choice = QMessageBox.question( self, '关闭', "您将要退出,是否保存当前文件", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if choice == QMessageBox.Yes: self.savefile(self.textEdit.toHtml()) e.accept() elif choice == QMessageBox.No: e.accept() else: e.ignore() else: e.accept() pass
def copyHtml(self): mimeData = QMimeData() mimeData.setHtml('<b>Bold and <font color=red>Red</font></b>') clipBoard = QApplication.clipboard() clipBoard.setMimeData(mimeData)
def copy_html(self): """Copy the selected range as HTML to the Qt clipboard.""" data = QMimeData() data.setHtml(self.html()) QApplication.clipboard().setMimeData(data)