PyQt: 如何给QTextEdit添加新标签页?

2 投票
1 回答
1611 浏览
提问于 2025-04-17 21:40

我想添加一个新的标签页,但遇到了一些问题。我想在主窗口中添加新的标签页,并且保留 Editor() 这个类的方法。我可以做到这一点,而不需要创建 Editor() 这个类,但我希望还是要这样做。抱歉我的英语不好。

这是我的代码:


from PyQt4 import QtGui
from PyQt4 import QtCore


class Main(QtGui.QMainWindow):

    def __init__(self):
        super(Main, self).__init__()

        self.initUi()

    def initUi(self):
        self.setWindowTitle("Editor")
        self.resize(640, 480)
        self.edit = Editor()

        newAc = QtGui.QAction('New', self)
        newAc.setShortcut('Ctrl+N')
        newAc.triggered.connect(self.new_)

        menu = self.menuBar()
        filemenu = menu.addMenu('&File')
        filemenu.addAction(newAc)

        self.tab = QtGui.QTabWidget(self)
        self.setCentralWidget(self.tab)


class Editor(QtGui.QTextEdit):

    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)


    def new_(self):
        tab = QtGui.QTextEdit(self.tab)
        self.tab.addTab(tab, 'Untitled')

def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

1 个回答

3

如果你想在多个标签页上显示相同的文字,可以使用同一个 Editor 类。但如果不想这样的话,就需要为每个标签页创建一个新的 Editor 对象。

另外,你的代码有一些问题:

1- 你把标签页的处理放在了 Editor 对象里面。其实应该在 Main 层面来处理标签页。

2- 当你创建 Main 对象时添加的“默认”标签页,并没有和 QTextEdit 有任何关联的变化:

self.tab = QtGui.QTabWidget(self)
self.setCentralWidget(self.tab)     # <---- tab without QTextEdit

加上这个:

self.tab = QtGui.QTabWidget(self)
self.editor = Editor(self.tab)      # editor receives self.tab widget as parent.
self.setCentralWidget(self.tab) 

另外,你还需要在 Main 之前定义 Editor 类。

3- Main 对象没有叫 new_ 的方法,只有 Editor 有。所以这一行:

newAc.triggered.connect(self.new_)

是错误的。

所以你的代码可能看起来像这样:

from PyQt4 import QtGui
from PyQt4 import QtCore


class Editor(QtGui.QTextEdit):

    def __init__(self, parent=None):
        super(Editor, self).__init__(parent)


class Main(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        self.initUi()

    def initUi(self):
        self.setWindowTitle("Editor")
        self.resize(640, 480)

        newAc = QtGui.QAction('New', self)
        newAc.setShortcut('Ctrl+N')
        newAc.triggered.connect(self.new_)

        menu = self.menuBar()
        filemenu = menu.addMenu('&File')
        filemenu.addAction(newAc)

        self.tab = QtGui.QTabWidget(self)
        self.setCentralWidget(self.tab)
        self.tab.addTab(Editor(), "New Text")

    def new_(self):
        self.tab.addTab(Editor(), "New text")


def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    w = Main()
    w.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

撰写回答