Vaebhav
Vaebhav

Reputation: 5032

Unable to resize QTableWidget

I m trying to resize a table widget inside a QVBoxlayout which I further add as a row to a QFormlayout in pyqt

I m currently adding a QVboxlayout which contains a table widget inside it as a row in a Qformlayout.

And the main aim is to strecth the Table widget till the end of the application window that it acquires the left over space on the window

Using the below code -

class PGSearchDetails():

    def __init__(self,parent=None):

         self.widget_pgsd = QWidget()
         self.layout_pgsd = QFormLayout()
         self.layout_pgsd.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy(2|1))
         self.PG_Id = QLineEdit()
         #rx = QRegExp("^\\D+[!,@,#,$,%,\^,&,*,(,),:,\",{,},?,<,>,|,+,-,~,]")
         #rx = QRegExp(" (?!(@,#,$|%|\^|&|*|(|)|:|\"|{|}|?|<|>|\||+|-|~|!))[\\w]+")
         str_rx = QRegExp("^[A-Za-z*]{20}(?!@#$%^&*():\"\{\}?<>\|+-~!_-)")
         adhr_rx = QRegExp("[A-Z0-9]{12}(?!@#$%^&*():\"\{\}?<>\|+-~!_)")

         val = QRegExpValidator(str_rx)
         val3 = QRegExpValidator(adhr_rx)

         self.PG_Id.setValidator(val3)
         self.LastName = QLineEdit()
         self.LastName.setValidator(val)
         self.MobNum = QLineEdit()
         qint_val = QIntValidator()
         qint_val.setTop(10)
         self.MobNum.setValidator(qint_val)


         self.layout_pgsd.addRow("First Name",self.PG_Id)
         self.layout_pgsd.addRow("Last Name",self.LastName)
         self.layout_pgsd.addRow("Mobile Number",self.MobNum)

         update_layout_pgsd = QHBoxLayout()

         layout_test,table = dbv.Search_View(self.getT)

         #layout_test.setGeometry(QRect(200,200,50,50))

         #table.setMaximumHeight(800)
         #table.setGeometry(200,200,200,200)
         #table.setGeometry(1,1,1000,600)
         table.resize(1000,600)

         update_btn_pgsd = QPushButton('Update')
         reset_btn_pgsd = QPushButton('Reset')

         update_layout_pgsd.addWidget(update_btn_pgsd)
         update_layout_pgsd.addWidget(reset_btn_pgsd)

         self.layout_pgsd.addRow(update_layout_pgsd)

         ##Adding the Table Widget to FormLayot
         self.layout_pgsd.addRow(layout_test)
         update_btn_pgsd.clicked.connect(partial(self.database,table,self.MobNum,
                                                         self.LastName))
         #self.widget.setLayout(self.layout_pgsd)


    def returnLayout(self):
        return self.layout_pgsd

    def returnWidget(self):
        return self.widget_pgsd

    def getT(self,linedit):
        print("LE--->",linedit.text())

QtableWidget setup ---

def Search_View(self):

    print("Inside Search_view")


    central_widget = QWidget()              # Create a central widget
    db_layout = QVBoxLayout()
    #col_count = len(self.pg_details.__dict__.keys())
    col_count = 3

    table = QTableWidget()  # Create a table
    #central_widget.setGeometry(200,200,150,150)
    #table.maximumSize()
    #db_layout.setMaximumSize(200)
    db_layout.setGeometry(QRect(0,0,100,30))


    db_layout.addWidget(table)


    ##Tried resizing the Table widget but nothing seems to works
    table.resize(1000,600)
    table.setGeometry(0,2,1000,600)

    #central_widget.resize(central_widget.sizeHint())

    #central_widget.setColumnWidth(1000,600)

    #db_layout.addItem(update_layout)

    central_widget.setLayout(db_layout)

    print("Geometry  H--->",table.geometry().height())
    print("Geometry  W--->",table.geometry().width())
    print("Geometry  X--->",table.geometry().x())
    print("Geometry  Y--->",table.geometry().y())



    return central_widget,table

After the resize function, The table geometry changes to 1000,600 but on the screen it is not reflected. On the app screen it remains the same size everytime

Also find the entire code which contains the Tablayouts as well and Stacked widget for individual radio buttons

class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.tab_widget = MainTabWindow()
        self.setCentralWidget(self.tab_widget)
        self.show()



class MainTabWindow(QTabWidget):

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

    def init_ui(self):
        self.setWindowTitle('PyQt5 Tab Example')

        self.tab1 = QWidget()

        self.addTab(self.tab1,"Search")


        self.PGSearchTab()


    def PGSearchTab(self):
      print("Search Tab First Tab")
      self.central_layout = QVBoxLayout()

      self.stack1 = QWidget()
      self.stack2 = QWidget()
      self.stack3 = QWidget()

      self.stack_widget = QStackedWidget()

      button_layout = QHBoxLayout()
      radio_button_1 = QRadioButton("Search")
      radio_button_2 = QRadioButton("Add")
      radio_button_3 = QRadioButton("Update")

      button_layout.addWidget(radio_button_1)
      button_layout.addWidget(radio_button_2)
      button_layout.addWidget(radio_button_3)

      self.central_layout.addItem(button_layout)

      self.stack_widget.addWidget(self.stack1)
      self.stack_widget.addWidget(self.stack2)
      self.stack_widget.addWidget(self.stack3)


      self.central_layout.addWidget(self.stack_widget)

      radio_button_1.toggled.connect(lambda :self.SelectButtonCheck(radio_button_1))

      self.setTabText(0,"Search")

      update_layout = QHBoxLayout()

      update_layout.setAlignment(QtCore.Qt.AlignBottom)
      update_btn = QPushButton('Update')
      reset_btn = QPushButton('Reset')


      update_layout.addWidget(update_btn)
      update_layout.addWidget(reset_btn)

      self.tab1.setLayout(self.central_layout)


    def SelectButtonCheck(self,b):
        if b.text() == "Search":
            if b.isChecked():
                print(b.text()+ "is selected")
                self.obj_pgsd = pgsd.PGSearchDetails()
                layout = self.obj_pgsd.returnLayout()
                if self.stack1.layout() is None:
                    self.stack1.setLayout(layout)

                self.stack_widget.setCurrentIndex(0)


def main():

    application = QApplication(sys.argv)
    main_window = MainTabWindow()
    main_window.show()
    sys.exit(application.exec_())

if __name__ == '__main__':
    main()

I do not seem to understand what is I m missing here

Any pointers would be appreciated.

Also find the working code to execute the above layout setup.

#!/usr/local/bin/python3

import sys
from PyQt5.QtWidgets import (QApplication, QWidget,QMainWindow,QLineEdit,QAction,
                            QLabel,QPushButton,QVBoxLayout,
                            QTabWidget,QFormLayout,QHBoxLayout,
                            QRadioButton,QCheckBox,QTextEdit,
                            QListView,QDialogButtonBox,QSizePolicy,QCalendarWidget)
from PyQt5 import QtCore
import PyQt5.Qt
from PyQt5.Qt import *
from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtSql
from functools import partial


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.tab_widget = MainTabWindow()
        self.setCentralWidget(self.tab_widget)
        self.show()



class MainTabWindow(QTabWidget):

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

    def init_ui(self):
        self.setWindowTitle('PyQt5 Tab Example')

        self.tab1 = QWidget()

        self.addTab(self.tab1,"Search")


        self.PGSearchTab()


    def PGSearchTab(self):
      print("Search Tab First Tab")
      self.central_layout = QVBoxLayout()

      self.stack1 = QWidget()
      self.stack2 = QWidget()
      self.stack3 = QWidget()

      self.stack_widget = QStackedWidget()

      button_layout = QHBoxLayout()
      radio_button_1 = QRadioButton("Search")
      radio_button_2 = QRadioButton("Add")
      radio_button_3 = QRadioButton("Update")

      button_layout.addWidget(radio_button_1)
      button_layout.addWidget(radio_button_2)
      button_layout.addWidget(radio_button_3)

      self.central_layout.addItem(button_layout)

      self.stack_widget.addWidget(self.stack1)
      self.stack_widget.addWidget(self.stack2)
      self.stack_widget.addWidget(self.stack3)


      self.central_layout.addWidget(self.stack_widget)

      radio_button_1.toggled.connect(lambda :self.SelectButtonCheck(radio_button_1))

      self.setTabText(0,"Search")

      update_layout = QHBoxLayout()

      update_layout.setAlignment(QtCore.Qt.AlignBottom)
      update_btn = QPushButton('Update')
      reset_btn = QPushButton('Reset')


      update_layout.addWidget(update_btn)
      update_layout.addWidget(reset_btn)

      self.tab1.setLayout(self.central_layout)


    def SelectButtonCheck(self,b):
        if b.text() == "Search":
            if b.isChecked():
                print(b.text()+ "is selected")
                self.obj_pgsd = PGSearchDetails()
                layout = self.obj_pgsd.returnLayout()
                if self.stack1.layout() is None:
                    self.stack1.setLayout(layout)

                self.stack_widget.setCurrentIndex(0)


class PGSearchDetails():

    def __init__(self,parent=None):

         self.widget_pgsd = QWidget()
         self.layout_pgsd = QFormLayout()
         self.layout_pgsd.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy(2|1))
         self.PG_Id = QLineEdit()
         #rx = QRegExp("^\\D+[!,@,#,$,%,\^,&,*,(,),:,\",{,},?,<,>,|,+,-,~,]")
         #rx = QRegExp(" (?!(@,#,$|%|\^|&|*|(|)|:|\"|{|}|?|<|>|\||+|-|~|!))[\\w]+")
         str_rx = QRegExp("^[A-Za-z*]{20}(?!@#$%^&*():\"\{\}?<>\|+-~!_-)")
         adhr_rx = QRegExp("[A-Z0-9]{12}(?!@#$%^&*():\"\{\}?<>\|+-~!_)")

         val = QRegExpValidator(str_rx)
         val3 = QRegExpValidator(adhr_rx)

         self.PG_Id.setValidator(val3)
         self.LastName = QLineEdit()
         self.LastName.setValidator(val)
         self.MobNum = QLineEdit()
         qint_val = QIntValidator()
         qint_val.setTop(10)
         self.MobNum.setValidator(qint_val)


         self.layout_pgsd.addRow("First Name",self.PG_Id)
         self.layout_pgsd.addRow("Last Name",self.LastName)
         self.layout_pgsd.addRow("Mobile Number",self.MobNum)

         update_layout_pgsd = QHBoxLayout()

         layout_test,table = self.Search_View(self.getT)

         #layout_test.setGeometry(QRect(200,200,50,50))

         #table.setMaximumHeight(800)
         #table.setGeometry(200,200,200,200)
         #table.setGeometry(1,1,1000,600)
         table.resize(1000,600)

         update_btn_pgsd = QPushButton('Update')
         reset_btn_pgsd = QPushButton('Reset')

         update_layout_pgsd.addWidget(update_btn_pgsd)
         update_layout_pgsd.addWidget(reset_btn_pgsd)

         self.layout_pgsd.addRow(update_layout_pgsd)

         ##Adding the Table Widget to FormLayot
         self.layout_pgsd.addRow(layout_test)
         update_btn_pgsd.clicked.connect(partial(self.database,table,self.MobNum,
                                                         self.LastName))
         #self.widget.setLayout(self.layout_pgsd)


    def returnLayout(self):
        return self.layout_pgsd

    def returnWidget(self):
        return self.widget_pgsd

    def getT(self,linedit):
        print("LE--->",linedit.text())

    def Search_View(self,text):

        print("Inside Search_view")


        central_widget = QWidget()              # Create a central widget
        db_layout = QVBoxLayout()
        #col_count = len(self.pg_details.__dict__.keys())
        col_count = 3

        table = QTableWidget()  # Create a table
        #central_widget.setGeometry(200,200,150,150)
        #table.maximumSize()
        #db_layout.setMaximumSize(200)
        db_layout.setGeometry(QRect(0,0,100,30))


        db_layout.addWidget(table)


        ##Tried resizing the Table widget but nothing seems to works
        table.resize(1000,600)
        table.setGeometry(0,2,1000,600)

        #central_widget.resize(central_widget.sizeHint())

        #central_widget.setColumnWidth(1000,600)

        #db_layout.addItem(update_layout)

        central_widget.setLayout(db_layout)

        print("Geometry  H--->",table.geometry().height())
        print("Geometry  W--->",table.geometry().width())
        print("Geometry  X--->",table.geometry().x())
        print("Geometry  Y--->",table.geometry().y())



        return central_widget,table

    def SqlExec(self,text):
        db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
        db.setHostName('localhost')
        db.setDatabaseName('Test')
        db.setUserName('root')
        db.open()

        query = QtSql.QSqlQuery()
        select = "select * from Test.PG_Details where PG_Id=?"# where PG_Id = 1"
        query.prepare(select)
        indexes = range(3)
        print("TEXT----->",text)
        query.addBindValue(text)
        #query.exec_(select)
        query.exec_()

        print("Sizze----",query.size())
        row_count = query.size()
        db.record('PG_Details')

        col_list = []

        for i in range(db.record('PG_Details').count()):
            print("FIELD----->",db.record('PG_Details').field(i).name())
            col_list.append(db.record('PG_Details').field(i).name())

        db.close()

        return query,row_count,col_list


    def database(self,table,text,text2):

        text = text.text()
        query_result,row_count,col_list = self.SqlExec(text)

        i = 0
        table.setColumnCount(3)     #Set three columns
        table.setRowCount(row_count)
        table.setHorizontalHeaderLabels(col_list)
        while query_result.next():
            #print(query_result.value(i))
            result_row = [query_result.value(index) for index in range(query_result.record().count())]
            #print("RR--->",result_row)
            for idx,val in enumerate(result_row):
                #print("IDX----->",idx)
                table.setItem(i, idx, QTableWidgetItem(val))
            i = i + 1



def main():

    application = QApplication(sys.argv)
    main_window = MainTabWindow()
    main_window.show()
    sys.exit(application.exec_())

if __name__ == '__main__':
    main()

enter image description here

Upvotes: 1

Views: 991

Answers (1)

eyllanesc
eyllanesc

Reputation: 243907

The problem is that QFormLayout makes every time you add a widget using addRow () uses strech, the solution is to use a QVBoxLayout, and in that QVBoxLayout is to pass the QFormLayout and the layout_test.

class PGSearchDetails():
    def __init__(self,parent=None):

         self.widget_pgsd = QWidget()
         self.layout = QVBoxLayout() # <---
         self.layout_pgsd = QFormLayout()
         self.layout.addLayout(self.layout_pgsd) # <---
         self.layout_pgsd.setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy(2|1))
         ...

         self.layout_pgsd.addRow(update_layout_pgsd)

         ##Adding the Table Widget to FormLayot
         # self.layout_pgsd.addRow(layout_test)
         self.layout.addWidget(layout_test) # <---
         update_btn_pgsd.clicked.connect(partial(self.database,table,self.MobNum,
                                                         self.LastName))


    def returnLayout(self):
        return self.layout # <---

enter image description here

Upvotes: 2

Related Questions