Domanda

I need to add a new tab, but I am having problems. I want to add new tabs in the main window, and keep the methods of the class Editor(). I can do this without having to create the class Editor() but need it to be so. Sorry for my English.

This is my code:


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()

È stato utile?

Soluzione

If you want to have the same text on both (or more) tabs you can use the same Editor class, but if not, you need instantiate an Editor object for each tab.

Also your code have some problems:

1- You are handling the tabs inside Editor objects. Instead, you must handle tabs at Main level.

2- The "default" tab you're adding when you create the Main object do not have any related QTextEdit change:

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

add this:

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

also you will need define Editor class before Main.

3- Main object don't have any method called new_, Editor does. So the line:

newAc.triggered.connect(self.new_)

it's wrong.

So your code might look like:

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top