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
Forum Updated to NodeBB v4.3 + New Features

Pagination in QtableWidget

Scheduled Pinned Locked Moved Solved General and Desktop
15 Posts 3 Posters 11.3k Views 2 Watching
  • 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 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