【问题标题】:How can I add tabs from PyQt4 to my text editor?如何将 PyQt4 中的选项卡添加到我的文本编辑器?
【发布时间】:2018-09-12 06:04:43
【问题描述】:

如何为我的文本编辑器显示选项卡,并能够替换“新建”操作的功能以创建新选项卡以及“打开”操作的功能以将文件打开到新选项卡?

这是我的代码:

#Imports
import sys, os
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QApplication, QColumnView, QFileSystemModel, QSplitter, QTreeView
from PyQt4.QtCore import Qt, QDir


class Window(QtGui.QMainWindow):

    #Window Settings
    def __init__(self):
        super(Window, self).__init__()
        self.showMaximized()
        self.setWindowTitle("Editory")
        self.setWindowIcon(QtGui.QIcon('favicon.png'))

        #Text Window
        self.text = QtGui.QTextEdit(self)
        self.text.setTabStopWidth(12)
        self.setCentralWidget(self.text)

        # Font variables
        fontBox = QtGui.QFontComboBox(self)
        fontBox.currentFontChanged.connect(self.FontFamily)

        fontSize = QtGui.QComboBox(self)
        fontSize.setEditable(True)
        fontSize.setMinimumContentsLength(3)

        fontSize.activated.connect(self.FontSize)

        # Font Sizes
        fontSizes = ['6','7','8','9','10','11','12','13','14',
             '15','16','18','20','22','24','26','28',
             '32','36','40','44','48','54','60','66',
             '72','80','88','96']

        for i in fontSizes:
            fontSize.addItem(i)

        #New Input
        new = QtGui.QAction("&New", self)
        new.setShortcut("Ctrl+N")
        new.triggered.connect(self.New)

        #Open Input
        open = QtGui.QAction("&Open", self)
        open.setShortcut("Ctrl+O")
        open.triggered.connect(self.Open)

        #Save Input
        save = QtGui.QAction("&Save", self)
        save.setShortcut("Ctrl+S")
        save.triggered.connect(self.Save)

        #Print Input
        prints = QtGui.QAction("&Print", self)
        prints.setShortcut("Ctrl+P")
        prints.triggered.connect(self.Print)

        #Quit Input
        quit = QtGui.QAction("&Quit", self)
        quit.setShortcut("Ctrl+Q")
        quit.triggered.connect(self.Quit)

        self.statusBar()

        #Menubar
        menubar = self.menuBar()

        #File Menu
        file = menubar.addMenu('&File')

        #File Inputs
        file.addAction(new)
        file.addAction(open)
        file.addAction(save)
        file.addAction(prints)
        file.addSeparator()
        file.addAction(quit)

        #Cut Input
        cut = QtGui.QAction("&Cut", self)
        cut.setShortcut("Ctrl+X")
        cut.triggered.connect(self.Cut)

        #Copy Input
        copy = QtGui.QAction("&Copy", self)
        copy.setShortcut("Ctrl+C")
        copy.triggered.connect(self.Copy)

        #Paste Input
        paste = QtGui.QAction("&Paste", self)
        paste.setShortcut("Ctrl+V")
        paste.triggered.connect(self.Paste)

        #Undo Input
        undo = QtGui.QAction("&Undo", self)
        undo.setShortcut("Ctrl+Z")
        undo.triggered.connect(self.Undo)

        #Redo Input
        redo = QtGui.QAction("&Redo", self)
        redo.setShortcut("Ctrl+Y")
        redo.triggered.connect(self.Redo)

        #Edit Menubar
        edit = menubar.addMenu('&Edit')

        #Edit Inputs
        edit.addAction(cut)
        edit.addAction(copy)
        edit.addAction(paste)
        edit.addSeparator()
        edit.addAction(undo)
        edit.addAction(redo)

        #Fullscreen Input
        fullscreen = QtGui.QAction("&Fullscreen", self)
        fullscreen.setShortcut("F11")
        fullscreen.triggered.connect(self.Fullscreen)

        #Align Left Input
        align_left = QtGui.QAction("&Align Left", self)
        align_left.triggered.connect(self.Align_Left)

        #Align Right Input
        align_right = QtGui.QAction("&Align Right", self)
        align_right.triggered.connect(self.Align_Right)

        #Align Center Input
        align_center = QtGui.QAction("&Align Center", self)
        align_center.triggered.connect(self.Align_Center)

        #Align Justify Input
        align_justify = QtGui.QAction("&Align Justify", self)
        align_justify.triggered.connect(self.Align_Justify)

        #View Menubar
        view = menubar.addMenu('&View')

        #View Inputs
        view.addAction(fullscreen)
        view.addSeparator()
        view.addAction(align_left)
        view.addAction(align_right)
        view.addAction(align_center)
        view.addAction(align_justify)

        #Font Family Input
        font_family = QtGui.QWidgetAction(self)
        font_family.setDefaultWidget(fontBox)

        #Settings Menubar
        settings = menubar.addMenu('&Settings')
        menu_font = settings.addMenu("&Font")
        menu_font.addAction(font_family)


        font_size = QtGui.QWidgetAction(self)
        font_size.setDefaultWidget(fontSize)
        menu_size = settings.addMenu("&Font Size")
        menu_size.addAction(font_size)

        self.toolbar()


    #Input Functions
    def New(self):
        self.text.clear()

    def Open(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
        f = open(filename, 'r')
        filedata = f.read()
        self.text.setText(filedata)
        f.close()

    def Save(self):
        name = QtGui.QFileDialog.getSaveFileName(self, 'Save File')
        file = open(name,'w')
        text = self.textEdit.toPlainText()
        file.write(text)
        file.close()

    def Print(self):
        print_dialog = QtGui.QPrintDialog()
        if print_dialog.exec_() == QtGui.QDialog.Accepted:
            self.text.document().print_(print_dialog.printer())

    def Quit(self):
        sys.exit()

    def Undo(self):
        self.text.undo()

    def Redo(self):
        self.text.redo()

    def Cut(self):
        self.text.cut()

    def Copy(self):
        self.text.copy()

    def Paste(self):
        self.text.paste()

    def Align_Left(self):
        self.text.setAlignment(Qt.AlignLeft)

    def Align_Right(self):
        self.text.setAlignment(Qt.AlignRight)

    def Align_Center(self):
        self.text.setAlignment(Qt.AlignCenter)

    def Align_Justify(self):
        self.text.setAlignment(Qt.AlignJustify)

    def Fullscreen(self):
        if not self.isFullScreen():
            self.showFullScreen()
        else:
            self.showMaximized()

    def FontFamily(self,font):
        self.text.setCurrentFont(font)

    def FontSize(self, fontsize):
        self.text.setFontPointSize(int(fontsize))

    #Toolbar
    def toolbar(self):

        #New Tool
        new = QtGui.QAction(QtGui.QIcon('icons/new.png'), 'New', self)
        new.triggered.connect(self.New)

        #Open Tool
        open = QtGui.QAction(QtGui.QIcon('icons/open.png'), 'Open', self)
        open.triggered.connect(self.Open)

        #Save Tool
        save = QtGui.QAction(QtGui.QIcon('icons/save.png'), 'Save', self)
        save.triggered.connect(self.Save)

        #Print Tool
        prints = QtGui.QAction(QtGui.QIcon('icons/print.png'), 'Print', self)
        prints.triggered.connect(self.Print)

        #Quit Tool
        quit = QtGui.QAction(QtGui.QIcon('icons/quit.png'), 'Quit', self)
        quit.triggered.connect(self.Quit)

        #Cut Tool
        cut = QtGui.QAction(QtGui.QIcon('icons/cut.png'), 'Cut', self)
        cut.triggered.connect(self.Cut)

        #Copy Tool
        copy = QtGui.QAction(QtGui.QIcon('icons/copy.png'), 'Copy', self)
        copy.triggered.connect(self.Copy)

        #Paste Tool
        paste = QtGui.QAction(QtGui.QIcon('icons/paste.png'), 'Paste', self)
        paste.triggered.connect(self.Paste)

        #Undo Tool
        undo = QtGui.QAction(QtGui.QIcon('icons/undo.png'), 'Undo', self)
        undo.triggered.connect(self.Undo)

        #Redo Tool
        redo = QtGui.QAction(QtGui.QIcon('icons/redo.png'), 'Redo', self)
        redo.triggered.connect(self.Redo)

        #Toolbar Menu
        self.toolbar = self.addToolBar("Toolbar")
        self.toolbar.addAction(new)
        self.toolbar.addAction(open)
        self.toolbar.addAction(save)
        self.toolbar.addSeparator()
        self.toolbar.addAction(cut)
        self.toolbar.addAction(copy)
        self.toolbar.addAction(paste)
        self.toolbar.addSeparator()
        self.toolbar.addAction(undo)
        self.toolbar.addAction(redo)
        self.toolbar.addSeparator()
        self.toolbar.addAction(prints)
        self.toolbar.addSeparator()
        self.toolbar.addAction(quit)

        #Reveals The Toolbar
        self.show()

#Run Function
def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())


run()

我尝试使用 Drewness 提供的答案并将其插入到我的代码中,但出现此错误:

TypeError: 'QTextEdit' 对象不可调用

【问题讨论】:

    标签: python pyqt pyqt4 qtextedit qtabwidget


    【解决方案1】:

    首先,拥有很多代码并不能帮助获得清晰的代码,所以我冒昧地减少它并对其进行排序。

    您必须设置QTabWidget AS centralWidget,并且在每个选项卡中创建QTextEdit,但您必须有一个当前QTextEdit,它在选择另一个选项卡时更改,为此,您必须使用currentChanged 信号。

    必须对那个QTextEdit进行所有操作,如果是new和open,你必须创建一个QTextEdit,并在必要时填写。

    import os
    import sys
    from PyQt4 import QtGui, QtCore
    
    class Window(QtGui.QMainWindow):
        def __init__(self):
            super(Window, self).__init__()
            self.showMaximized()
            self.setWindowTitle("Editory")
            self.setWindowIcon(QtGui.QIcon('favicon.png'))
    
            self.current_editor = self.create_editor()
            self.editors = []
    
            self.tab_widget = QtGui.QTabWidget()
            self.tab_widget.setTabsClosable(True)
            self.tab_widget.currentChanged.connect(self.change_text_editor)
            self.tab_widget.tabCloseRequested.connect(self.remove_editor)
            self.new_document()
            self.setCentralWidget(self.tab_widget)
    
            self.configure_menuBar()
            self.configure_toolbar()
    
        def configure_menuBar(self):
            menubar = self.menuBar()
    
            menubar_items = {
                '&File': [
                    ("&New", "Ctrl+N", self.new_document),
                    ("&Open", "Ctrl+O", self.open_document),
                    ("&Save", "Ctrl+S", self.save_document),
                    ("&Print", "Ctrl+P", self.print_document),
                    None,
                    ("&Quit", "Ctrl+Q", self.quit),
                ],
                '&Edit': [
                    ("&Cut", "Ctrl+X", self.cut_document),
                    ("&Copy", "Ctrl+C", self.copy_document),
                    ("&Paste", "Ctrl+V", self.paste_document),
                    None,
                    ("&Undo", "Ctrl+Z", self.undo_document),
                    ("&Redo", "Ctrl+Y", self.redo_document)
                ],
                '&View': [
                    ("&Fullscreen", "F11", self.fullscreen),
                    None,
                    ("&Align Left", "", self.align_left),
                    ("&Align Right", "", self.align_right),
                    ("&Align Center", "", self.align_center),
                    ("&Align Justify", "", self.align_justify)
                ]
            }
    
            for menuitem, actions in menubar_items.items():
                menu = menubar.addMenu(menuitem)
                for act in actions:
                    if act:
                        text, shorcut, callback = act
                        action = QtGui.QAction(text, self)
                        action.setShortcut(shorcut)
                        action.triggered.connect(callback)
                        menu.addAction(action)
                    else :
                        menu.addSeparator()
    
            # Font Family Input
            fontBox = QtGui.QFontComboBox(self)
            fontBox.currentFontChanged.connect(self.FontFamily)
    
            fontSize = QtGui.QComboBox(self)
            fontSize.setEditable(True)
            fontSize.setMinimumContentsLength(3)
    
            fontSize.activated.connect(self.FontSize)
    
            # Font Sizes
            fontSizes = ['6', '7', '8', '9', '10', '11', '12', '13', '14',
                '15', '16', '18', '20', '22', '24', '26', '28',
                '32', '36', '40', '44', '48', '54', '60', '66',
                '72', '80', '88', '96'
            ]
    
            fontSize.addItems(fontSizes)
            font_family = QtGui.QWidgetAction(self)
            font_family.setDefaultWidget(fontBox)
            # Settings Menubar
            settings = menubar.addMenu('&Settings')
            menu_font = settings.addMenu("&Font")
            menu_font.addAction(font_family)
    
            font_size = QtGui.QWidgetAction(self)
            font_size.setDefaultWidget(fontSize)
            menu_size = settings.addMenu("&Font Size")
            menu_size.addAction(font_size)
    
        def configure_toolbar(self):
            items = (('icons/new.png', 'New', self.new_document),
                ('icons/open.png', 'Open', self.open_document),
                ('icons/save.png', 'Save', self.save_document),
                None,
                ('icons/cut.png', 'Cut', self.cut_document),
                ('icons/copy.png', 'Copy', self.copy_document),
                ('icons/paste.png', 'Paste', self.paste_document),
                None,
                ('icons/undo.png', 'Undo', self.undo_document),
                ('icons/redo.png', 'Redo', self.redo_document),
                None,
                ('icons/print.png', 'Print', self.print_document),
                None,
                ('icons/quit.png', 'Quit', self.quit),
            )
    
            self.toolbar = self.addToolBar("Toolbar")
    
            for item in items:
                if item:
                    icon, text, callback = item
                    action = QtGui.QAction(QtGui.QIcon(icon), text, self)
                    action.triggered.connect(callback)
                    self.toolbar.addAction(action)
                else :
                    self.toolbar.addSeparator()
    
        def remove_editor(self, index):
            self.tab_widget.removeTab(index)
            if index < len(self.editors):
                del self.editors[index]
    
        def create_editor(self):
            text_editor = QtGui.QTextEdit()
            text_editor.setTabStopWidth(12)
            return text_editor
    
        def change_text_editor(self, index):
            if index < len(self.editors):
                self.current_editor = self.editors[index]
    
        # Input Functions
        def new_document(self, checked = False, title = "Untitled"):
            self.current_editor = self.create_editor()
            self.editors.append(self.current_editor)
            self.tab_widget.addTab(self.current_editor, title + str(len(self.editors)))
            self.tab_widget.setCurrentWidget(self.current_editor)
    
        def open_document(self):
            filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
            if filename:
                f = open(filename, 'r')
            filedata = f.read()
            self.new_document(title = filename)
            self.current_editor.setText(filedata)
            f.close()
    
        def save_document(self):
            name = QtGui.QFileDialog.getSaveFileName(self, 'Save File')
            file = open(name, 'w')
            if file:
                text = self.current_editor.toPlainText()
                file.write(text)
                file.close()
    
        def print_document(self):
            print_dialog = QtGui.QPrintDialog()
            if print_dialog.exec_() == QtGui.QDialog.Accepted:
                self.current_editor.document().print_(print_dialog.printer())
    
        def quit(self): self.close()
    
        def undo_document(self): self.current_editor.undo()
    
        def redo_document(self): self.current_editor.redo()
    
        def cut_document(self): self.current_editor.cut()
    
        def copy_document(self): self.current_editor.copy()
    
        def paste_document(self): self.current_editor.paste()
    
        def align_left(self): self.current_editor.setAlignment(Qt.AlignLeft)
    
        def align_right(self): self.current_editor.setAlignment(Qt.AlignRight)
    
        def align_center(self): self.current_editor.setAlignment(Qt.AlignCenter)
    
        def align_justify(self):
            self.current_editor.setAlignment(Qt.AlignJustify)
    
        def fullscreen(self):
            if not self.isFullScreen():
                self.showFullScreen()
            else :
                self.showMaximized()
    
        def FontFamily(self, font):
            self.current_editor.setCurrentFont(font)
    
        def FontSize(self, fontsize):
            self.current_editor.setFontPointSize(int(fontsize))
    
    def run():
        app = QtGui.QApplication(sys.argv)
        GUI = Window()
        sys.exit(app.exec_())
    
    run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多