class CalculateSalaryWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.__parent = parent self.setWindowTitle("Calculate Salary") t = datetime.now() self.month = QComboBox() self.month.addItems([ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" ]) self.month.setCurrentIndex(t.month - 1) self.year = QSpinBox() self.year.setRange(1900, 3000) self.year.setValue(t.year) self.name = SearchBox(self) self.name.setPlaceholderText("Enter Name") self.name.returnPressed.connect(self.setIDList) self.nameList = [] self.nameList = DatabaseManager.db.getEmployeeNameList() self.name.setList(self.nameList) self.name.setCurrentIndex(-1) self.id = QComboBox() self.id.currentIndexChanged.connect( lambda: self.loadInfo(self.id.currentText())) self.designation = QLineEdit() self.designation.setReadOnly(True) self.originalPay = QLineEdit() self.originalPay.setReadOnly(True) self.originalPayGrade = QLineEdit() self.originalPayGrade.setReadOnly(True) self.DOJ = QLineEdit() self.DOJ.setReadOnly(True) self.pan = QLineEdit() self.pan.setReadOnly(True) self.presentPay = QLineEdit() self.presentPay.setReadOnly(True) self.da_percent = ValueBox() self.hra_percent = ValueBox() self.ta_percent = ValueBox() self.it_percent = ValueBox() self.pt_percent = ValueBox() self.name.editTextChanged.connect(self.clearInfo) self.bttnCalculate = QPushButton("Calculate") self.bttnCalculate.clicked.connect(self.calculate) self.bttnCancel = QPushButton("Back") self.bttnCancel.clicked.connect(self.goBack) self.bttnCalculate.setObjectName("OkButton") self.bttnCancel.setObjectName("CancelButton") self.setupUI() def calculate(self): if "" in (self.id.currentText(), self.name.text(), self.designation.text(), self.originalPay.text(), self.originalPayGrade.text(), self.DOJ.text(), self.pan.text(), self.da_percent.text(), self.hra_percent.text(), self.ta_percent.text(), self.it_percent.text(), self.pt_percent.text()): msg = QMessageBox(QMessageBox.Information, "Error", "Please enter all the information!", parent=self) msg.exec_() else: if self.__parent is not None: self.__parent.gotoPage( "Result", (self.id.currentText(), self.name.text(), self.designation.text(), self.originalPay.text(), self.originalPayGrade.text(), self.DOJ.text(), self.pan.text(), self.da_percent.text(), self.hra_percent.text(), self.ta_percent.text(), self.it_percent.text(), self.pt_percent.text(), self.month.currentText(), self.year.text())) def clearInfo(self): self.id.setCurrentIndex(-1) self.designation.clear() self.originalPay.clear() self.originalPayGrade.clear() self.DOJ.clear() self.pan.clear() self.da_percent.clear() self.hra_percent.clear() self.ta_percent.clear() self.it_percent.clear() self.pt_percent.clear() def loadInfo(self, id): print "id =", id, "...", len(id) if id != '': info = DatabaseManager.db.getEmployeeInfo(id) _, _, designation, originalPay, originalPayGrade, doj, pan = info self.designation.setText(str(designation)) self.originalPay.setText(str(originalPay)) self.originalPayGrade.setText(str(originalPayGrade)) self.DOJ.setText("%02d/%02d/%4d" % (doj.day, doj.month, doj.year)) self.pan.setText(str(pan)) _, da, hra, ta, it, pt = DatabaseManager.db.getDesignationInfo( designation) self.da_percent.setText(str(da)) self.hra_percent.setText(str(hra)) self.ta_percent.setText(str(ta)) self.it_percent.setText(str(it)) self.pt_percent.setText(str(pt)) def setIDList(self, name): self.id.clear() self.id.addItems(DatabaseManager.db.getIdListForName(name)) def goBack(self): if self.__parent is not None: self.__parent.goBack() def setupUI(self): layout = QVBoxLayout() layout.setContentsMargins(20, 20, 20, 10) datelayout = QHBoxLayout() datelayout.addWidget(QLabel("Salary for month of ")) datelayout.addWidget(self.month) datelayout.addWidget(self.year) datelayout.addStretch() layout.addLayout(datelayout) form = QFormLayout() form.setSpacing(10) form.addRow(QLabel("Name"), self.name) form.addRow(QLabel("ID No."), self.id) form.addRow(QLabel("Designation"), self.designation) form.addRow(QLabel("Original Pay"), self.originalPay) form.addRow(QLabel("Original Pay Grade"), self.originalPayGrade) form.addRow(QLabel("Date of joining"), self.DOJ) form.addRow(QLabel("Pan No."), self.pan) infoGroup = QGroupBox("Basic Info") infoGroup.setLayout(form) layout.addWidget(infoGroup) leftForm = QFormLayout() leftForm.addRow(QLabel("Dearness Allowance"), self.da_percent) leftForm.addRow(QLabel("Housing Rent Allowance"), self.hra_percent) leftForm.addRow(QLabel("Transport Allowance"), self.ta_percent) leftGroup = QGroupBox("Allowances") leftGroup.setLayout(leftForm) rightForm = QFormLayout() rightForm.addRow(QLabel("Income Tax"), self.it_percent) rightForm.addRow(QLabel("Profession Tax"), self.pt_percent) rightGroup = QGroupBox("Deductions") rightGroup.setLayout(rightForm) table = QHBoxLayout() table.addWidget(leftGroup) table.addWidget(rightGroup) layout.addLayout(table) layout.addStretch() bttnLayout = QHBoxLayout() bttnLayout.addStretch() bttnLayout.addWidget(self.bttnCancel) bttnLayout.addWidget(self.bttnCalculate) layout.addLayout(bttnLayout) self.setLayout(layout)
class EditEmployeeWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.__parent = parent # ------elements for selecting employee----------- self.nameSearch = SearchBox(self) self.nameSearch.setPlaceholderText("Enter Name") self.nameSearch.returnPressed.connect(self.setIDList) # self.name.currentIndexChanged.connect(self.setIDList) self.nameList = [] self.nameList = DatabaseManager.db.getEmployeeNameList() self.nameSearch.setList(self.nameList) self.nameSearch.setCurrentIndex(-1) self.id = QComboBox() self.id.currentIndexChanged.connect(lambda: self.loadInfo(self.id.currentText())) # ------elements for ediiting employee----------- self.nameEdit = QLineEdit(self) self.nameEdit.setValidator(QRegExpValidator(QRegExp("[a-zA-Z\s]+"))) self.designation = QComboBox(self) self.originalPay = QLineEdit(self) self.originalPay.setValidator(QDoubleValidator()) self.originalPayGrade = QLineEdit(self) self.originalPayGrade.setValidator(QDoubleValidator()) self.DOJ = DatePicker(self) self.pan = QLineEdit(self) self.pan.setValidator(QRegExpValidator(QRegExp("[A-Z]{5}\d{4}[A-Z]"))) self.bttnSave = QPushButton("Save Changes") self.bttnCancel = QPushButton("Back") self.bttnSave.setObjectName("OkButton") self.bttnCancel.setObjectName("CancelButton") self.bttnCancel.clicked.connect(self.goBack) self.bttnSave.clicked.connect(self.save) self.designation.addItems(DatabaseManager.db.getDesignations()) self.nameSearch.editTextChanged.connect(self.clearInfo) self.clearInfo() self.setupUI() def save(self): id = self.id.currentText() name = self.nameEdit.text() designation = self.designation.currentText() originalPay = self.originalPay.text() originalPayGrade = self.originalPayGrade.text() doj = self.DOJ.getDate() doj = "%4d-%02d-%02d" % (doj.year(), doj.month(), doj.day()) pan = self.pan.text() print name, designation, originalPay, originalPayGrade, doj, pan if "" in [id, name, designation, originalPay, originalPayGrade, doj, pan]: msg = QMessageBox(QMessageBox.Information, "Error", "Please enter all the information!", parent=self) msg.exec_() else: try: DatabaseManager.db.editEmployee(id, name, designation, float(originalPay), float(originalPayGrade), doj, pan) except mysql.connector.Error as e: ShowMysqlError(e, self) return QMessageBox(QMessageBox.NoIcon, "Success", "Employee edited successfully", parent=self).exec_() def clearInfo(self): self.id.setCurrentIndex(-1) self.nameEdit.clear() self.designation.setCurrentIndex(-1) self.originalPay.clear() self.originalPayGrade.clear() self.DOJ.clear() self.pan.clear() self.nameEdit.setReadOnly(True) self.originalPay.setReadOnly(True) self.originalPayGrade.setReadOnly(True) self.DOJ.setReadOnly(True) self.pan.setReadOnly(True) # reload stylesheet to refelect changes of readonly self.nameEdit.setStyle(self.style()) self.originalPay.setStyle(self.style()) self.originalPayGrade.setStyle(self.style()) self.DOJ.setStyle(self.style()) self.pan.setStyle(self.style()) def setIDList(self, name): self.id.clear() self.id.addItems(DatabaseManager.db.getIdListForName(name)) def loadInfo(self, id): print "id =", id, "...", len(id) if id != '': info = DatabaseManager.db.getEmployeeInfo(id) _, name, designation, originalPay, originalPayGrade, doj, pan = info # self.designation.setText(str(designation)) self.nameEdit.setText(name) self.designation.setCurrentIndex(self.designation.findText(str(designation))) self.originalPay.setText(str(originalPay)) self.originalPayGrade.setText(str(originalPayGrade)) # self.DOJ.setText("%02d/%02d/%4d" % (doj.day, doj.month, doj.year)) self.DOJ.setDate(QDate(doj.year, doj.month, doj.day)) self.pan.setText(str(pan)) self.nameEdit.setReadOnly(False) self.originalPay.setReadOnly(False) self.originalPayGrade.setReadOnly(False) self.DOJ.setReadOnly(False) self.pan.setReadOnly(False) # reload stylesheet to refelect changes of readonly self.nameEdit.setStyle(self.style()) self.originalPay.setStyle(self.style()) self.originalPayGrade.setStyle(self.style()) self.DOJ.setStyle(self.style()) self.pan.setStyle(self.style()) def goBack(self): if self.__parent is not None: self.__parent.goBack() def setupUI(self): layout = QVBoxLayout() layout.setContentsMargins(20, 20, 20, 10) selectGroup = QGroupBox("Select") form1 = QFormLayout() form1.addRow(QLabel("Name"), self.nameSearch) form1.addRow(QLabel("ID No."), self.id) selectGroup.setLayout(form1) editGroup = QGroupBox("Edit below") form = QFormLayout() form.setSpacing(20) form.addRow(QLabel("Name"), self.nameEdit) form.addRow(QLabel("Designation"), self.designation) form.addRow(QLabel("Original Pay"), self.originalPay) form.addRow(QLabel("Original Pay Grade"), self.originalPayGrade) form.addRow(QLabel("Date of joining"), self.DOJ) form.addRow(QLabel("Pan No."), self.pan) editGroup.setLayout(form) layout.addWidget(selectGroup) layout.addWidget(editGroup) layout.addStretch() bttnLayout = QHBoxLayout() bttnLayout.addStretch() bttnLayout.addWidget(self.bttnCancel) bttnLayout.addWidget(self.bttnSave) layout.addLayout(bttnLayout) self.setLayout(layout)
class EditEmployeeWidget(QWidget): """PySide widget that contains GUI for editing existing employee record from the database This contains a ``SearchBox`` for selecting name of employee who's record needs to be edited. Selecting the name automatically loads IDs of all employees with that name (in case multiple employees have exact same name) in a dropdown box (``QComboBox``). After selecting the required ID from there, the employee info is automatically loaded into some input boxes on screen. These input boxes are created using ``ValidatingLineEdit`` module. User may make necessary changes in these boxes. These boxes will also give a feedback that is the edited input valid or not (as they are created using ``ValidatingLineEdit``) A 'Save' button (``QPushButton``) is present at the bottom. Clicking it checks if all inputs are valid. If any of the inputs are invalid, error message is shown for the first invalid input. Otherwise, an ``Employee`` object is created from the edited info and passed to ``editEmployee()`` method of DatabaseManager module to update the employee record in Database. See Also: - :py:mod:`SearchBox <CustomWidgets.searchBox.SearchBox>` widget from CustomWidgets - :py:mod:`ValidatingLineEdit <CustomWidgets.validatingLineEdit.ValidatingLineEdit>` class from CustomWidgets - :py:mod:`Employee <CustomClasses.Employee.Employee>` class from CustomClasses - :py:meth:`editEmployee() <DatabaseManager.databaseManager.DatabaseManager.editEmployee>` method of DatabaseManager """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.__parent = parent self.title = "Edit Employee" # ------elements for selecting employee----------- self.nameSearch = SearchBox(self) self.nameSearch.setPlaceholderText("Enter Name") self.nameList = [] self.nameList = Database.getdb().getEmployeeNameList() self.nameSearch.setList(self.nameList) self.nameSearch.setCurrentIndex(-1) self.id = QComboBox() self.id.currentIndexChanged.connect( lambda: self.loadInfo(self.id.currentText())) self.nameSearch.returnPressed.connect(self.setIDList) # ------elements for ediiting employee----------- self.nameEdit = ValidatingLineEdit("Name", "[a-zA-Z\s]+", self) self.designation = QComboBox(self) self.originalPay = ValidatingLineEdit("Original Pay", QDoubleValidator(), self) self.originalPayGrade = ValidatingLineEdit("Original Pay Grade", QDoubleValidator(), self) self.DOJ = DatePicker(self) self.pan = ValidatingLineEdit("PAN", "[A-Z]{5}\d{4}[A-Z]", self) self.inputs = [ self.nameEdit, self.originalPay, self.originalPayGrade, self.pan ] self.bttnSave = QPushButton("Save Changes") self.bttnCancel = QPushButton("Back") self.bttnSave.setObjectName("OkButton") self.bttnCancel.setObjectName("CancelButton") self.bttnCancel.clicked.connect(self.goBack) self.bttnSave.clicked.connect(self.save) self.designation.addItems(Database.getdb().getDesignations()) self.nameSearch.editTextChanged.connect(self.clearInfo) self.clearInfo() self.setupUI() def save(self): valid = True if len(self.id.currentText()) == 0: QMessageBox(QMessageBox.Information, "Error", "Please select name and ID!", parent=self).exec_() valid = False else: for i in range(len(self.inputs)): if not self.inputs[i].isValid(): valid = False QtGui.QMessageBox(QtGui.QMessageBox.Information, "Error", self.inputs[i].getErrorMessage(), parent=self).exec_() break if valid: emp = Employee(self.id.currentText(), self.nameEdit.text(), self.designation.currentText(), self.originalPay.text(), self.originalPayGrade.text(), self.DOJ.getDate(), self.pan.text()) try: Database.getdb().editEmployee(emp) except mysql.connector.Error as e: ShowMysqlError(e, self) return QMessageBox(QMessageBox.NoIcon, "Success", "Employee edited successfully", parent=self).exec_() def setInputReadOnly(self, TrueOrFalse): self.nameEdit.setReadOnly(TrueOrFalse) self.originalPay.setReadOnly(TrueOrFalse) self.originalPayGrade.setReadOnly(TrueOrFalse) self.DOJ.setReadOnly(TrueOrFalse) self.pan.setReadOnly(TrueOrFalse) # reload stylesheet to refelect changes of readonly self.nameEdit.setStyle(self.style()) self.originalPay.setStyle(self.style()) self.originalPayGrade.setStyle(self.style()) self.DOJ.setStyle(self.style()) self.pan.setStyle(self.style()) def clearInfo(self): self.id.setCurrentIndex(-1) self.nameEdit.clear() self.designation.setCurrentIndex(-1) self.originalPay.clear() self.originalPayGrade.clear() self.DOJ.clear() self.pan.clear() self.setInputReadOnly(True) def setIDList(self, name): self.id.clear() self.id.addItems(Database.getdb().getIdListForName(name)) def loadInfo(self, id): print "id =", id, "...", len(id) if id != '': emp = Database.getdb().getEmployeeInfo(id) self.nameEdit.setText(emp.name) self.designation.setCurrentIndex( self.designation.findText(emp.designation)) self.originalPay.setText(str(emp.originalPay)) self.originalPayGrade.setText(str(emp.originalPayGrade)) self.DOJ.setDate(emp.getQDate()) self.pan.setText(emp.pan) self.setInputReadOnly(False) def goBack(self): if self.__parent is not None: self.__parent.goBack() def setupUI(self): paneLayout = QHBoxLayout() paneLayout.setContentsMargins(0, 0, 0, 0) leftPane = QFrame() leftPane.setObjectName("leftPane") leftPaneLayout = QVBoxLayout() leftPaneLayout.setContentsMargins(20, 20, 20, 10) heading = QLabel("Select Employee: ") heading.setObjectName("heading") leftPaneLayout.addWidget(heading) leftPaneLayout.addSpacing(10) form1 = QFormLayout() form1.addRow(QLabel("Name"), self.nameSearch) form1.addRow(QLabel("ID No."), self.id) leftPaneLayout.addLayout(form1) leftPaneLayout.addStretch() leftPane.setLayout(leftPaneLayout) layout = QVBoxLayout() layout.setContentsMargins(20, 20, 20, 10) editGroup = QGroupBox("Edit below") form = QFormLayout() form.setContentsMargins(10, 10, 10, 30) form.setSpacing(20) form.addRow(QLabel("Name"), self.nameEdit) form.addRow(QLabel("Designation"), self.designation) form.addRow(QLabel("Original Pay"), self.originalPay) form.addRow(QLabel("Original Pay Grade"), self.originalPayGrade) form.addRow(QLabel("Date of joining"), self.DOJ) form.addRow(QLabel("Pan No."), self.pan) editGroup.setLayout(form) layout.addWidget(editGroup) layout.addStretch() bttnLayout = QHBoxLayout() bttnLayout.addStretch() bttnLayout.addWidget(self.bttnCancel) bttnLayout.addWidget(self.bttnSave) layout.addLayout(bttnLayout) paneLayout.addWidget(leftPane) paneLayout.addLayout(layout) self.setLayout(paneLayout)
class CalculateSalaryWidget(QWidget): """A PySide widget which provides GUI for selecting employee and calculating salary for a month & year Tis contains boxes for month and year input. Enter the month and year of salary to be calculated here. This is initially automatically set to present month and year. Also contains a ``SearchBox`` for selecting name of employee who's salary needs to be calculated. Selecting the name automatically loads IDs of all employees with that name (in case multiple employees have exact same name) in a dropdown box (``QComboBox``). After selecting the required ID from there, the employee info is automatically loaded. The allowances and deductions are loaded in ``ValueBoxes`` and hence may be edited if required. After selecting everything, user needs to click 'calculate' button. This creates a ``Salary`` object from available info. The actual salary calculation takes place inside ``Salary`` class. This salary object is then passed to ``ShowPaySlipWidget`` which shows the final result and has option to confirm the calculation and print the payslip. Note: To automatically call functions on GUI interaction such as button click, PySide Signal and Slots are used. visit http://zetcode.com/gui/pysidetutorial/eventsandsignals/ for more on PySide Signal and Slots. See Also: - :py:mod:`SearchBox <CustomWidgets.searchBox.SearchBox>` widget from CustomWidgets - :py:mod:`ValueBox <CustomWidgets.valueBox.ValueBox>` widget from CustomWidgets - :py:mod:`Salary <CustomClasses.Salary.Salary>` class from CustomClasses - :py:mod:`ShowPaySlipWidget <ShowPaySlip.ShowPaySlipWidget>` """ def __init__(self, parent=None): QWidget.__init__(self, parent) self.__parent = parent self.title = "Calculate Salary" self.__desig = None self.__emp = None t = datetime.now() self.month = QComboBox() self.month.addItems([ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" ]) self.month.setCurrentIndex(t.month - 1) self.year = QSpinBox() self.year.setRange(1900, 3000) self.year.setValue(t.year) self.name = SearchBox(self) self.name.setPlaceholderText("Enter Name") self.nameList = [] self.nameList = Database.getdb().getEmployeeNameList() self.name.setList(self.nameList) self.id = QComboBox() self.designation = QLineEdit() self.designation.setReadOnly(True) self.originalPay = QLineEdit() self.originalPay.setReadOnly(True) self.originalPayGrade = QLineEdit() self.originalPayGrade.setReadOnly(True) self.DOJ = QLineEdit() self.DOJ.setReadOnly(True) self.pan = QLineEdit() self.pan.setReadOnly(True) self.presentPay = QLineEdit() self.presentPay.setReadOnly(True) self.da_percent = ValueBox() self.hra_percent = ValueBox() self.ta_percent = ValueBox() self.it_percent = ValueBox() self.pt_percent = ValueBox() self.name.editTextChanged.connect(self.clearInfo) self.bttnCalculate = QPushButton("Calculate") self.bttnCalculate.clicked.connect(self.calculate) self.bttnCancel = QPushButton("Back") self.bttnCancel.clicked.connect(self.goBack) self.bttnCalculate.setObjectName("OkButton") self.bttnCancel.setObjectName("CancelButton") self.name.returnPressed.connect(self.setIDList) self.id.currentIndexChanged.connect( lambda: self.loadInfo(self.id.currentText())) self.setupUI() def calculate(self): """Automatically called on clicking calculate button""" if self.__emp is None: QMessageBox(QMessageBox.Information, "Error", "Please select an employee!", parent=self).exec_() else: if self.__parent is not None: self.__desig = Designation(self.__desig.designation, self.da_percent.text(), self.hra_percent.text(), self.ta_percent.text(), self.it_percent.text(), self.pt_percent.text()) salary = Salary(self.__emp, self.__desig, self.month.currentText(), self.year.text()) self.__parent.gotoPage("Result", salary) def clearInfo(self): """Clears the contents of all input/display boxes""" self.id.setCurrentIndex(-1) self.designation.clear() self.originalPay.clear() self.originalPayGrade.clear() self.DOJ.clear() self.pan.clear() self.da_percent.clear() self.hra_percent.clear() self.ta_percent.clear() self.it_percent.clear() self.pt_percent.clear() self.__desig = None self.__emp = None def loadInfo(self, id): """Loads info for given ID in the GUI boxes. This automatically called on selecting an ID from GUI Args: id (str): ID of employee who's info needs to be loaded """ print "id =", id, "...", len(id) if id != '': self.__emp = Database.getdb().getEmployeeInfo(id) self.designation.setText(self.__emp.designation) self.originalPay.setText(str(self.__emp.originalPay)) self.originalPayGrade.setText(str(self.__emp.originalPayGrade)) self.DOJ.setText(self.__emp.getStrDate()) self.pan.setText(self.__emp.pan) self.__desig = Database.getdb().getDesignationInfo( self.__emp.designation) self.da_percent.setText(str(self.__desig.da)) self.hra_percent.setText(str(self.__desig.hra)) self.ta_percent.setText(str(self.__desig.ta)) self.it_percent.setText(str(self.__desig.it)) self.pt_percent.setText(str(self.__desig.pt)) def setIDList(self, name): """Loads IDs of all employees with given name into the ID dropdown box This function is automatically called after selecting a name from the GUI Args: name (str): Name of employee """ self.id.clear() self.id.addItems(Database.getdb().getIdListForName(name)) def goBack(self): if self.__parent is not None: self.__parent.goBack() def setupUI(self): """Arranges GUI elements inside the widget properly""" paneLayout = QHBoxLayout() paneLayout.setContentsMargins(0, 0, 0, 0) leftPane = QFrame() leftPane.setObjectName("leftPane") leftPaneLayout = QVBoxLayout() leftPaneLayout.setContentsMargins(20, 20, 20, 10) heading = QLabel("Select Employee: ") heading.setObjectName("heading") leftPaneLayout.addWidget(heading) leftPaneLayout.addSpacing(10) datelayout = QHBoxLayout() datelayout.addWidget(QLabel("Salary for month of ")) datelayout.addWidget(self.month) datelayout.addWidget(self.year) datelayout.addStretch() leftPaneLayout.addLayout(datelayout) leftForm = QFormLayout() leftForm.setSpacing(10) leftForm.addRow(QLabel("Name"), self.name) leftForm.addRow(QLabel("ID No."), self.id) leftPaneLayout.addLayout(leftForm) leftPaneLayout.addStretch() leftPane.setLayout(leftPaneLayout) paneLayout.addWidget(leftPane) layout = QVBoxLayout() layout.setContentsMargins(20, 20, 20, 10) form = QFormLayout() form.setSpacing(10) form.addRow(QLabel("Designation"), self.designation) form.addRow(QLabel("Original Pay"), self.originalPay) form.addRow(QLabel("Original Pay Grade"), self.originalPayGrade) form.addRow(QLabel("Date of joining"), self.DOJ) form.addRow(QLabel("Pan No."), self.pan) infoGroup = QGroupBox("Basic Info") infoGroup.setLayout(form) layout.addWidget(infoGroup) leftForm = QFormLayout() leftForm.addRow(QLabel("Dearness Allowance"), self.da_percent) leftForm.addRow(QLabel("Housing Rent Allowance"), self.hra_percent) leftForm.addRow(QLabel("Transport Allowance"), self.ta_percent) leftGroup = QGroupBox("Allowances") leftGroup.setLayout(leftForm) rightForm = QFormLayout() rightForm.addRow(QLabel("Income Tax"), self.it_percent) rightForm.addRow(QLabel("Profession Tax"), self.pt_percent) rightGroup = QGroupBox("Deductions") rightGroup.setLayout(rightForm) table = QHBoxLayout() table.addWidget(leftGroup) table.addWidget(rightGroup) layout.addLayout(table) layout.addStretch() bttnLayout = QHBoxLayout() bttnLayout.addStretch() bttnLayout.addWidget(self.bttnCancel) bttnLayout.addWidget(self.bttnCalculate) layout.addLayout(bttnLayout) paneLayout.addLayout(layout) self.setLayout(paneLayout)