コード例 #1
0
 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)
コード例 #2
0
 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
コード例 #3
0
    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_()
コード例 #4
0
    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
コード例 #5
0
    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)
コード例 #6
0
ファイル: effects_model.py プロジェクト: Xen0byte/openshot-qt
    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
コード例 #7
0
ファイル: workflows.py プロジェクト: megamcloud/pyspread
    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)
コード例 #8
0
ファイル: files_model.py プロジェクト: Xen0byte/openshot-qt
    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
コード例 #9
0
    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
コード例 #10
0
ファイル: effects_model.py プロジェクト: OpenShot/openshot-qt
    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
コード例 #11
0
    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
コード例 #12
0
 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)
コード例 #13
0
    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)
コード例 #14
0
ファイル: mainwindow.py プロジェクト: snyoung/frescobaldi
    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)
コード例 #15
0
ファイル: mainwindow.py プロジェクト: AlexSchr/frescobaldi
    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)
コード例 #16
0
ファイル: CopyAsHtml.py プロジェクト: edwoods/PBLadder
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)
コード例 #17
0
 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)
コード例 #18
0
ファイル: qt04_QClipboard.py プロジェクト: kiorry/PYQT
	def copyHtml(self):
		mimeData = QMimeData()
		mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
		clipboard = QApplication.clipboard()
		clipboard.setMimeData(mimeData)
コード例 #19
0
 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文本设置入剪贴板
コード例 #20
0
ファイル: 4.11.2.py プロジェクト: LuffyToX/GUI_Py
 def copyHtml(self):
     # QApplication.clipboard() 返回对剪切板对象的引用
     mimeData = QMimeData()
     mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
     clipboard = QApplication.clipboard()
     clipboard.setMimeData(mimeData)
コード例 #21
0
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')
コード例 #22
0
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
コード例 #23
0
ファイル: main.py プロジェクト: zhouhktk/easytextedit
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
コード例 #24
0
 def copyHtml(self):
     mimeData = QMimeData()
     mimeData.setHtml('<b>Bold and <font color=red>Red</font></b>')
     clipBoard = QApplication.clipboard()
     clipBoard.setMimeData(mimeData)
コード例 #25
0
ファイル: document.py プロジェクト: wbsoft/parceqt
 def copy_html(self):
     """Copy the selected range as HTML to the Qt clipboard."""
     data = QMimeData()
     data.setHtml(self.html())
     QApplication.clipboard().setMimeData(data)