phaigeim
phaigeim

Reputation: 749

Running Pyqt UIs in tabs using TabWidget

I want to run my app in different tabs. Rightnow, it is running in main window. I have done some search work on how to create tabs. I found this to be useful, but not sufficient to meet my requirements

Create TAB and create textboxes that take data in the TAB-page

I want to have a feature of adding a new tab (like new tab in chrome) Below is my code sample. I described what i require in the comments.

from PyQt4 import Qt, QtCore, QtGui
import sys
class Map(QtGui.QMainWindow):
def __init__(self,parentQExampleScrollArea=None,parentQWidget = None):
    super(Map,self).__init__()
    self.initUI()


#Initialize the UI
def initUI(self):
    #Initilizing Menus toolbars
    #This must be maintained in all tabbed panes
    filename = ""
    #Filename is obtained through open file button in file menu
    self.filename = filename

def paintEvent(self, e):

    qp = QtGui.QPainter()
    qp.begin(self)

    self.drawPoints(qp,self.filename)

    qp.end()

def drawPoints(self, qp,FILENAME=""):
    #Read contents in file
    #Get the necessary coordinates
    #A separate class for storing the info of all the coordinates

    #Run a for loop for all the coordinates in the list
    #Actually, object is created here and image of that object is set
    # as  a square using the coordinates
    qp.setBrush(QtGui.QColor(255, 0, 20, 200))        
    qp.drawRect(20,20,75,75)
    qp.drawRect(100,20,75,75)
    self.update()

    #There are many functions to handle keyboard and mouse events



def main():
#How do I modify so that I can have multiple tabs
#And show images of the coordinates in files
#Basically I want to have the feature of opening many files
# and displaying them in UI
#Basically a feature to add a new tab
#like that of in eclipse netbeans sublime etc

app = QtGui.QApplication(sys.argv)
myQExampleScrollArea = Map()
myQExampleScrollArea.show()
sys.exit(app.exec_())

if __name__ == '__main__':
   main()    

Thanks in advance.. :)

Upvotes: 1

Views: 3160

Answers (1)

Bandhit Suksiri
Bandhit Suksiri

Reputation: 3450

It's simply to use method int QTabWidget.addTab (self, QWidget widget, QString) to create widget in tab. In each tab, I suggest use QtGui.QWidget more than QtGui.QMainWindow;

Example;

import sys
from PyQt4 import QtGui

class QCustomWidget (QtGui.QWidget):
    # Your widget to implement
    # Put your override method here

    def paintEvent (self, eventQPaintEvent):
        currentQPainter = QtGui.QPainter()
        currentQPainter.begin(self)
        currentQPainter.setBrush(QtGui.QColor(255, 0, 20, 200))        
        currentQPainter.drawRect(20, 20, 75, 75)
        currentQPainter.drawRect(100, 20, 75, 75)
        self.update()
        currentQPainter.end()

class QCustomTabWidget (QtGui.QTabWidget):
    def __init__ (self, parent = None):
        super(QCustomTabWidget, self).__init__(parent)
        self.addTab(QtGui.QPushButton('Test'), 'Tab 1')
        self.addTab(QCustomWidget(),           'Tab 2')

myQApplication = QtGui.QApplication([])
myQCustomTabWidget = QCustomTabWidget()
myQCustomTabWidget.show()
sys.exit(myQApplication.exec_())

So handle with more tab, It's bad to create many line call int QTabWidget.addTab (self, QWidget widget, QString). Anyway, All widget has add in QTabWidget is can reference in ifself. So, your can control element in it by call QWidget QTabWidget.widget (self, int index).

Example to call widget in tab widget;

import os
import sys
from PyQt4 import QtCore, QtGui

class QCustomLabel (QtGui.QLabel):
    def __init__(self, imagePath, parentQWidget = None):
        super(QCustomLabel, self).__init__(parentQWidget)
        self.setPixmap(QtGui.QPixmap(imagePath))

class QCustomWidget (QtGui.QWidget):
    def __init__ (self, parentQWidget = None):
        super(QCustomWidget, self).__init__(parentQWidget)
        self.addQPustButton = QtGui.QPushButton('Open image')
        self.addQPustButton.setMaximumWidth(120)
        self.addQPustButton.released.connect(self.openImage)
        self.workSpaceQTabWidget = QtGui.QTabWidget()
        self.workSpaceQTabWidget.setTabsClosable(True)
        self.workSpaceQTabWidget.tabCloseRequested.connect(self.closeImage)
        allQVBoxLayout = QtGui.QVBoxLayout()
        allQVBoxLayout.addWidget(self.addQPustButton)
        allQVBoxLayout.addWidget(self.workSpaceQTabWidget)
        self.setLayout(allQVBoxLayout)

    def openImage (self):
        path = QtGui.QFileDialog.getOpenFileName(self, 'Open image')
        if not path.isEmpty():
            self.workSpaceQTabWidget.addTab(QCustomLabel(path), QtCore.QString(os.path.basename(str(path))))

    def closeImage (self, currentIndex):
        currentQWidget = self.workSpaceQTabWidget.widget(currentIndex)
        currentQWidget.deleteLater()
        self.workSpaceQTabWidget.removeTab(currentIndex)

myQApplication = QtGui.QApplication([])
myQCustomWidget = QCustomWidget()
myQCustomWidget.show() 
sys.exit(myQApplication.exec_())

Upvotes: 2

Related Questions