Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Pagination in QtableWidget

Pagination in QtableWidget

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 3 Posters 11.0k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • khakhilK Offline
    khakhilK Offline
    khakhil
    wrote on last edited by
    #1

    Hi I am using python and have a QTableWidget that showing the data fetching from database.
    Now I want pagination , suppose i have 20 rows which are displayed in table correctly but i want paging so that 6 rows are displayed at a time and next 6 rows are displayed on next page.

    I tried the following:

    def listshow(self):
    db = MySQLdb.connect("localhost","root","","kailash" )
    cursor = db.cursor()
    try:
    a="SELECT * FROM customer_list"
    cursor.execute(a)

            self.tableWidget.setRowCount(cursor.rowcount) 
            self.tableWidget.setColumnCount(8)
    
            row_count = 0
            while True:        
                row = cursor.fetchone()
                if row == None:
                    break
    
                btn_name = 'print_btn_'+ str(row[0])
                
                button = QtGui.QPushButton(btn_name, self)
                button.setText('Print')
                button.setObjectName(btn_name)      
                self.tableWidget.setCellWidget(row_count, 7, button)
                button.clicked.connect( self.print_command )
                for col in range(0,7):
                    self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
    
    
                row_count = row_count+1
        except:
            db.close()
    
    raven-worxR khakhilK 2 Replies Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by mrjj
      #2

      @khakhil said:

      hi and welcome
      QTableWidget dont have pages, but an endless scrolling list.
      So what do you mean on next page?

      You can of cause, store the result list.
      add 6 elements to the Table
      add a button
      when button pressed, clear list and add 6 new.
      also button to go the other way.

      khakhilK 1 Reply Last reply
      0
      • mrjjM mrjj

        @khakhil said:

        hi and welcome
        QTableWidget dont have pages, but an endless scrolling list.
        So what do you mean on next page?

        You can of cause, store the result list.
        add 6 elements to the Table
        add a button
        when button pressed, clear list and add 6 new.
        also button to go the other way.

        khakhilK Offline
        khakhilK Offline
        khakhil
        wrote on last edited by khakhil
        #3

        @mrjj
        I tried the following for you suggested:

        self.pushButton_5.clicked.connect(self.next)  
        
        def next(self):
            self.pushButton_4.setEnabled(True)
            db = MySQLdb.connect("localhost","root","","kailash" )
        
            cursor = db.cursor()
            x=3
            try:
                cursor = db.cursor()
                
                b="SELECT * FROM customer_list  limit 3 offset %s" % (x) 
                cursor.execute(b)
                self.tableWidget.setRowCount(cursor.rowcount) 
                self.tableWidget.setColumnCount(8)
        
                row_count = 0
                while True:        
                    row = cursor.fetchone()
                    if row == None:
                        break
        
                    btn_name = 'print_btn_'+ str(row[0])  
        
                    button = QtGui.QPushButton(btn_name, self)
                    button.setText('Print')
                    button.setObjectName(btn_name)      
                    self.tableWidget.setCellWidget(row_count, 7, button)
                    button.clicked.connect( self.print_command )
                    for col in range(0,7):
                        self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
        
                    row_count = row_count+1
                    
            except:
                db.close()
        

        but i am not getting that how offset value is changes when button is is pressed continuously.
        please help !!!
        thank you :)

        1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #4

          @khakhil said:

          b="SELECT * FROM customer_list limit 3 offset %s" % (x)

          oh that can return list and offset the result ?
          ( i never used SQL offset before)

          My idea was slightly more lame :)
          put result in list and have currentpos to that list
          then add from currentpos to +6 to list.

          khakhilK 1 Reply Last reply
          0
          • khakhilK khakhil

            Hi I am using python and have a QTableWidget that showing the data fetching from database.
            Now I want pagination , suppose i have 20 rows which are displayed in table correctly but i want paging so that 6 rows are displayed at a time and next 6 rows are displayed on next page.

            I tried the following:

            def listshow(self):
            db = MySQLdb.connect("localhost","root","","kailash" )
            cursor = db.cursor()
            try:
            a="SELECT * FROM customer_list"
            cursor.execute(a)

                    self.tableWidget.setRowCount(cursor.rowcount) 
                    self.tableWidget.setColumnCount(8)
            
                    row_count = 0
                    while True:        
                        row = cursor.fetchone()
                        if row == None:
                            break
            
                        btn_name = 'print_btn_'+ str(row[0])
                        
                        button = QtGui.QPushButton(btn_name, self)
                        button.setText('Print')
                        button.setObjectName(btn_name)      
                        self.tableWidget.setCellWidget(row_count, 7, button)
                        button.clicked.connect( self.print_command )
                        for col in range(0,7):
                            self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
            
            
                        row_count = row_count+1
                except:
                    db.close()
            
            raven-worxR Offline
            raven-worxR Offline
            raven-worx
            Moderators
            wrote on last edited by
            #5

            @khakhil
            just an idea (inspired by @mrjj 's answer)

            1. use QSoftFilterProxyModel and add custom properties. One for the count of items to display "per page" and one for the current page index.
            2. reimplement filterAcceptsRow() and check if the source row fulfills the following requirement:
            (currentPage * pageSize) <= source_row && source_row < (currentPage * pageSize) + pageSize
            
            1. hide the vertical scrollbar of the item view by setting the scrollbarpolicy to Qt::ScrollBarAlwaysOff
            2. place a custom scrollbar beside the table view. This can either be done by setting the viewport-margins (QAbstractScrollArea) and do the positioning of the scrollbar beside the viewport on resize events yourself or simply place it beside the whole table if thats enough for you.
            3. set the range of the custom scrollbar from 0 to (rowCount / pageSize)
            4. connect the scrollbar's valueChanged() signal to the filter-model's current-page property and invalidate the filter-model (QSortFilterProxyModel::invalidate())

            --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
            If you have a question please use the forum so others can benefit from the solution in the future

            1 Reply Last reply
            3
            • mrjjM mrjj

              @khakhil said:

              b="SELECT * FROM customer_list limit 3 offset %s" % (x)

              oh that can return list and offset the result ?
              ( i never used SQL offset before)

              My idea was slightly more lame :)
              put result in list and have currentpos to that list
              then add from currentpos to +6 to list.

              khakhilK Offline
              khakhilK Offline
              khakhil
              wrote on last edited by
              #6

              @mrjj said:

              (x)

              yup... it is working very well . i am confused that how increase the value of x when next button is pressed again and again.

              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by mrjj
                #7

                well im pyt noob but
                if you set x=0 in constructor of mainwidnow
                then in button
                x=x+3; // or what ever

                Currently u set x=3 on each button click so u need to init it somewhere else
                and then in button increase / decrease.

                However, you should check out what @raven-worx writes about.
                its much smarter way. :)

                khakhilK 1 Reply Last reply
                0
                • mrjjM mrjj

                  well im pyt noob but
                  if you set x=0 in constructor of mainwidnow
                  then in button
                  x=x+3; // or what ever

                  Currently u set x=3 on each button click so u need to init it somewhere else
                  and then in button increase / decrease.

                  However, you should check out what @raven-worx writes about.
                  its much smarter way. :)

                  khakhilK Offline
                  khakhilK Offline
                  khakhil
                  wrote on last edited by khakhil
                  #8

                  @mrjj
                  yes i tried the increasing and decreasing way but its not working.

                  @raven-worx
                  sorry, i tried the way u have suggested but unable to implement .

                  mrjjM raven-worxR 2 Replies Last reply
                  0
                  • khakhilK khakhil

                    @mrjj
                    yes i tried the increasing and decreasing way but its not working.

                    @raven-worx
                    sorry, i tried the way u have suggested but unable to implement .

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    @khakhil
                    but
                    if u change
                    x=12
                    it does change what it lists?

                    khakhilK 1 Reply Last reply
                    0
                    • khakhilK khakhil

                      @mrjj
                      yes i tried the increasing and decreasing way but its not working.

                      @raven-worx
                      sorry, i tried the way u have suggested but unable to implement .

                      raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #10

                      @khakhil said:

                      sorry, i tried the way u have suggest but unable to implement .

                      well i would be surprised if you could implement it in 30 mins being a Qt beginner.
                      Maybe you can show what u got so far...

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      1 Reply Last reply
                      1
                      • mrjjM mrjj

                        @khakhil
                        but
                        if u change
                        x=12
                        it does change what it lists?

                        khakhilK Offline
                        khakhilK Offline
                        khakhil
                        wrote on last edited by
                        #11

                        @mrjj said:

                        @khakhil
                        but
                        if u change
                        x=12
                        it does change what it lists?

                        when i change x=12.. i got 3 rows which are on the position 13,14,15 in database table.
                        and next button only works once.

                        mrjjM 1 Reply Last reply
                        0
                        • khakhilK khakhil

                          @mrjj said:

                          @khakhil
                          but
                          if u change
                          x=12
                          it does change what it lists?

                          when i change x=12.. i got 3 rows which are on the position 13,14,15 in database table.
                          and next button only works once.

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          @khakhil
                          ok so offset works nice. good.
                          then why did
                          x=x+3
                          or
                          x=x-3

                          not work?
                          u should move
                          x=3 to constructor
                          also the creation and connect of the button should not be in
                          "next" as it will create new button on all next() ?
                          i assume this
                          button = QtGui.QPushButton(btn_name, self)
                          creates a new button ?

                          1 Reply Last reply
                          0
                          • khakhilK khakhil

                            Hi I am using python and have a QTableWidget that showing the data fetching from database.
                            Now I want pagination , suppose i have 20 rows which are displayed in table correctly but i want paging so that 6 rows are displayed at a time and next 6 rows are displayed on next page.

                            I tried the following:

                            def listshow(self):
                            db = MySQLdb.connect("localhost","root","","kailash" )
                            cursor = db.cursor()
                            try:
                            a="SELECT * FROM customer_list"
                            cursor.execute(a)

                                    self.tableWidget.setRowCount(cursor.rowcount) 
                                    self.tableWidget.setColumnCount(8)
                            
                                    row_count = 0
                                    while True:        
                                        row = cursor.fetchone()
                                        if row == None:
                                            break
                            
                                        btn_name = 'print_btn_'+ str(row[0])
                                        
                                        button = QtGui.QPushButton(btn_name, self)
                                        button.setText('Print')
                                        button.setObjectName(btn_name)      
                                        self.tableWidget.setCellWidget(row_count, 7, button)
                                        button.clicked.connect( self.print_command )
                                        for col in range(0,7):
                                            self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
                            
                            
                                        row_count = row_count+1
                                except:
                                    db.close()
                            
                            khakhilK Offline
                            khakhilK Offline
                            khakhil
                            wrote on last edited by
                            #13

                            @khakhil
                            hii thanks @mrjj and @raven-worx for helping.

                            for this problem i have tried following and it doing very well

                            def search(self, offset = 0):
                                name_get = self.lineEdit.text()
                                db = MySQLdb.connect("localhost","root","","kailash" )
                            
                                try:
                                    cursor = db.cursor()
                                    
                                    limit = 6
                                    
                                    if name_get == None or name_get == '':
                                        count_q = "SELECT  COUNT(1) AS num_rows FROM customer_list"                
                                    else:
                                        count_q = "SELECT COUNT(1) AS num_rows FROM customer_list WHERE name= '%s'" % (name_get) 
                                    cursor.execute(count_q)
                                    row = cursor.fetchone() 
                                    num_rows = row[0]
                                    
                                       
                                    if name_get == None or name_get == '':
                                        b = "SELECT * FROM customer_list"
                                        b += " limit "+ str(limit) + " offset " + str(offset)
                                    else:
                                        b = "SELECT * FROM customer_list WHERE name= '%s'" % (name_get)
                                     
                                    cursor.execute(b)
                                    self.tableWidget.setRowCount(cursor.rowcount + 2)
                                    self.tableWidget.setColumnCount(8)
                                    
                                    print cursor.rowcount
                            
                                    row_count = 0
                                    while True:
                                        row = cursor.fetchone()
                                        if row == None:
                                            break
                            
                                        btn_name = 'print_btn_'+ str(row[0])
                            
                                        button = QtGui.QPushButton(btn_name, self)
                                        button.setText('Print')
                                        button.setObjectName(btn_name)
                                        self.tableWidget.setCellWidget(row_count, 7, button)
                                        button.clicked.connect( self.print_command )
                                        for col in range(0,7):
                                            self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
                            
                                        row_count = row_count+1                
                                        
                                 
                                        
                                    if limit + offset < num_rows:
                                        next_offset = limit + offset
                                        self.nextbutton = QtGui.QPushButton("Next", self)
                                        self.tableWidget.setCellWidget(row_count+1, 4, self.nextbutton)
                                        self.nextbutton.setObjectName('next_btn_' + str(next_offset))
                                        self.nextbutton.clicked.connect( lambda: self.search(next_offset) )    
                                    
                                    if offset >= limit :
                                        prev_offset = offset - limit
                                        self.prebutton = QtGui.QPushButton("Previous", self)
                                        self.tableWidget.setCellWidget(row_count+1, 3, self.prebutton)
                                        self.prebutton.setObjectName('prev_btn_' + str(prev_offset))
                                        self.prebutton.clicked.connect( lambda: self.search(prev_offset) 
                            

                            but the problem is that whenever next button is clicked newly added row override the previous displayed rows. so if i have 10 rows in database and limit is set to 6 then if i clicked next button starting 4 rows are overrides but last two rows are same as previous last row.

                            Is there any other approach to display database table data in the form of bunches????

                            1 Reply Last reply
                            0
                            • mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @khakhil said:
                              Hi
                              maybe you can just call
                              self.tableWidget.clear()
                              to start fresh each time you add items?

                              khakhilK 1 Reply Last reply
                              1
                              • mrjjM mrjj

                                @khakhil said:
                                Hi
                                maybe you can just call
                                self.tableWidget.clear()
                                to start fresh each time you add items?

                                khakhilK Offline
                                khakhilK Offline
                                khakhil
                                wrote on last edited by khakhil
                                #15

                                @mrjj said:

                                self.tableWidget.clear()

                                Thanks a lot @mrjj :) :) :)
                                it works for me.
                                thank you so much

                                def search(self, offset = 0):
                                    self.tableWidget.clear()
                                    name_get = self.lineEdit.text()
                                    db = MySQLdb.connect("localhost","root","","kailash" )
                                
                                    try:
                                        cursor = db.cursor()
                                        
                                        limit = 6
                                        
                                        if name_get == None or name_get == '':
                                            count_q = "SELECT  COUNT(1) AS num_rows FROM customer_list"                
                                        else:
                                            count_q = "SELECT COUNT(1) AS num_rows FROM customer_list WHERE name= '%s'" % (name_get) 
                                        cursor.execute(count_q)
                                        row = cursor.fetchone() 
                                        num_rows = row[0]
                                        
                                           
                                        if name_get == None or name_get == '':
                                            b = "SELECT * FROM customer_list"
                                            b += " limit "+ str(limit) + " offset " + str(offset)
                                        else:
                                            b = "SELECT * FROM customer_list WHERE name= '%s'" % (name_get)
                                         
                                        cursor.execute(b)
                                        self.tableWidget.setRowCount(cursor.rowcount + 2)
                                        self.tableWidget.setColumnCount(8)
                                        
                                        print cursor.rowcount
                                
                                        row_count = 0
                                        while True:
                                            row = cursor.fetchone()
                                            if row == None:
                                                break
                                
                                            btn_name = 'print_btn_'+ str(row[0])
                                
                                            button = QtGui.QPushButton(btn_name, self)
                                            button.setText('Print')
                                            button.setObjectName(btn_name)
                                            self.tableWidget.setCellWidget(row_count, 7, button)
                                            button.clicked.connect( self.print_command )
                                            for col in range(0,7):
                                                self.tableWidget.setItem(row_count, col , QtGui.QTableWidgetItem( str(row[col]) ))
                                
                                            row_count = row_count+1                
                                            
                                     
                                            
                                        if limit + offset < num_rows:
                                            next_offset = limit + offset
                                            self.nextbutton = QtGui.QPushButton("Next", self)
                                            self.tableWidget.setCellWidget(row_count+1, 4, self.nextbutton)
                                            self.nextbutton.setObjectName('next_btn_' + str(next_offset))
                                            self.nextbutton.clicked.connect( lambda: self.search(next_offset) )    
                                        
                                        if offset >= limit :
                                            prev_offset = offset - limit
                                            self.prebutton = QtGui.QPushButton("Previous", self)
                                            self.tableWidget.setCellWidget(row_count+1, 3, self.prebutton)
                                            self.prebutton.setObjectName('prev_btn_' + str(prev_offset))
                                            self.prebutton.clicked.connect( lambda: self.search(prev_offset) )                
                                            
                                            
                                    except Exception, e:
                                
                                1 Reply Last reply
                                1

                                • Login

                                • Login or register to search.
                                • First post
                                  Last post
                                0
                                • Categories
                                • Recent
                                • Tags
                                • Popular
                                • Users
                                • Groups
                                • Search
                                • Get Qt Extensions
                                • Unsolved