Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Connect to mongoDB and display data in table
Forum Updated to NodeBB v4.3 + New Features

Connect to mongoDB and display data in table

Scheduled Pinned Locked Moved Unsolved Qt for Python
14 Posts 4 Posters 1.8k 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.
  • P Offline
    P Offline
    praneshpk
    wrote on 16 Jun 2021, 08:23 last edited by
    #1

    Hi everyone,
    I am creating an application that connects to MongoDB and displays the data in table view/ table widget. I am able to get the data and convert it to a dataframe using a pushbutton. but not able to view the data. here is my code,

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.pushButton.clicked.connect(self.button_click)
        self.table.clicked.connect(self.returndata)
    
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
    
    
    @pyqtSlot( )
    def button_click(self):
        client = MongoClient("mongodb://localhost:27017/", username="sunadmin", password="sunpassword")
        db = client['mail_test']
        test = db.mail_test
        test = pd,DataFrame(list(test.find()))
        print(test)
    
    @pyqtSlot( )
    def returndata(self):
        test = self.table.text()
    
    J 1 Reply Last reply 16 Jun 2021, 08:26
    0
    • P praneshpk
      16 Jun 2021, 08:23

      Hi everyone,
      I am creating an application that connects to MongoDB and displays the data in table view/ table widget. I am able to get the data and convert it to a dataframe using a pushbutton. but not able to view the data. here is my code,

          self.retranslateUi(MainWindow)
          QtCore.QMetaObject.connectSlotsByName(MainWindow)
          self.pushButton.clicked.connect(self.button_click)
          self.table.clicked.connect(self.returndata)
      
      def retranslateUi(self, MainWindow):
          _translate = QtCore.QCoreApplication.translate
          MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
          self.pushButton.setText(_translate("MainWindow", "PushButton"))
      
      
      @pyqtSlot( )
      def button_click(self):
          client = MongoClient("mongodb://localhost:27017/", username="sunadmin", password="sunpassword")
          db = client['mail_test']
          test = db.mail_test
          test = pd,DataFrame(list(test.find()))
          print(test)
      
      @pyqtSlot( )
      def returndata(self):
          test = self.table.text()
      
      J Offline
      J Offline
      jsulm
      Lifetime Qt Champion
      wrote on 16 Jun 2021, 08:26 last edited by
      #2

      @praneshpk said in Connect to mongoDB and display data in table:

      not able to view the data

      What does that mean? Where are you showing the data?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • P Offline
        P Offline
        praneshpk
        wrote on 16 Jun 2021, 08:35 last edited by
        #3

        I need to show data in tablewidget, for which the function is table

        J 1 Reply Last reply 16 Jun 2021, 08:39
        0
        • P praneshpk
          16 Jun 2021, 08:35

          I need to show data in tablewidget, for which the function is table

          J Offline
          J Offline
          JonB
          wrote on 16 Jun 2021, 08:39 last edited by JonB
          #4

          @praneshpk
          So if you want to use a QTableWidget you would need to copy the returned data into the appropriate items.

          Usually a QTableView is a better choice if you have your own data model. QTableWidget has its own internal model which you cannot change.

          test = pd,DataFrame(list(test.find()))
          

          I am not familiar that Python has this syntax? [I thought the parentheses for tuples were mandatory.] And what is pd anyway since it's not declared? [This may not matter now.]

          1 Reply Last reply
          1
          • P Offline
            P Offline
            praneshpk
            wrote on 16 Jun 2021, 08:56 last edited by
            #5

            python is fine. What I am asking is how to display some text in tableview when button is pressed

            J 1 Reply Last reply 16 Jun 2021, 08:58
            0
            • P praneshpk
              16 Jun 2021, 08:56

              python is fine. What I am asking is how to display some text in tableview when button is pressed

              J Offline
              J Offline
              JonB
              wrote on 16 Jun 2021, 08:58 last edited by JonB
              #6

              @praneshpk
              Look at QTableView Class and (particularly) Model/View Programming for your choices and examples.

              Only you know how the data/model returned by, say, DataFrame(list(test.find())) looks.

              1 Reply Last reply
              3
              • P Offline
                P Offline
                praneshpk
                wrote on 16 Jun 2021, 13:56 last edited by
                #7

                It is working. Thanks.
                Now I'm able to get data from MongoDB and display it in table view. But the size is not adjusted.
                I have attached the code and screenshot. I have tried resizing. It is not working

                    self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
                    self.tableView.resizeRowsToContents()
                    self.tableView.resizeColumnsToContents()
                

                74673ded-2cc4-4626-b1c1-cf545f8f8d99-image.png

                J 1 Reply Last reply 16 Jun 2021, 15:07
                0
                • P praneshpk
                  16 Jun 2021, 13:56

                  It is working. Thanks.
                  Now I'm able to get data from MongoDB and display it in table view. But the size is not adjusted.
                  I have attached the code and screenshot. I have tried resizing. It is not working

                      self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
                      self.tableView.resizeRowsToContents()
                      self.tableView.resizeColumnsToContents()
                  

                  74673ded-2cc4-4626-b1c1-cf545f8f8d99-image.png

                  J Offline
                  J Offline
                  JonB
                  wrote on 16 Jun 2021, 15:07 last edited by
                  #8

                  @praneshpk
                  I don't know about setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents), that is to do with the tableview as a whole. I don't think I have ever used that. resizeColumnsToContents() ought work. But when do you call it? Must be after the table data is shown. I assume your whole table has enough room, and you're just trying to resize a column within it; or does your whole table need expanding to fit that column?

                  1 Reply Last reply
                  3
                  • P Offline
                    P Offline
                    praneshpk
                    wrote on 16 Jun 2021, 15:50 last edited by
                    #9

                    Whole table has fixed size and contents are not visible, I need to resize so that I can see the contents easily.

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 16 Jun 2021, 17:29 last edited by
                      #10

                      Hi,

                      Is your table view inside a layout ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      2
                      • P Offline
                        P Offline
                        praneshpk
                        wrote on 17 Jun 2021, 04:40 last edited by
                        #11

                        No, it is inside stacked pages widget

                        1 Reply Last reply
                        0
                        • P Offline
                          P Offline
                          praneshpk
                          wrote on 17 Jun 2021, 09:59 last edited by
                          #12

                          I'm getting contents in a fixed size, I need this to be changed manually or dynamically.

                          def button_click(self):
                              client = MongoClient("mongodb://localhost:27017/", username="sunadmin", password="sunpassword")
                              db = client['mail_test']
                              collection = db.mail_test
                              df = pd.DataFrame(list(collection.find()))
                              df = df.filter(["sub_body"])
                              print(df)
                          
                              model = PandasModel(df)
                              self.tableView.setModel(model)
                          

                          and the model file is ,

                          from PyQt5 import QtCore
                          import pandas as pd
                          
                          class PandasModel(QtCore.QAbstractTableModel): 
                              def __init__(self, df = pd.DataFrame(), parent=None): 
                                  QtCore.QAbstractTableModel.__init__(self, parent=parent)
                                  self._df = df
                          
                              def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
                                  if role != QtCore.Qt.DisplayRole:
                                      return QtCore.QVariant()
                          
                                  if orientation == QtCore.Qt.Horizontal:
                                      try:
                                          return self._df.columns.tolist()[section]
                                      except (IndexError, ):
                                          return QtCore.QVariant()
                                  elif orientation == QtCore.Qt.Vertical:
                                      try:
                                          # return self.df.index.tolist()
                                          return self._df.index.tolist()[section]
                                      except (IndexError, ):
                                          return QtCore.QVariant()
                          
                              def data(self, index, role=QtCore.Qt.DisplayRole):
                                  if role != QtCore.Qt.DisplayRole:
                                      return QtCore.QVariant()
                          
                                  if not index.isValid():
                                      return QtCore.QVariant()
                          
                                  return QtCore.QVariant(str(self._df.iloc[index.row(), index.column()]))
                          
                              def setData(self, index, value, role):
                                  row = self._df.index[index.row()]
                                  col = self._df.columns[index.column()]
                                  if hasattr(value, 'toPyObject'):
                                      # PyQt4 gets a QVariant
                                      value = value.toPyObject()
                                  else:
                                      # PySide gets an unicode
                                      dtype = self._df[col].dtype
                                      if dtype != object:
                                          value = None if value == '' else dtype.type(value)
                                  self._df.set_value(row, col, value)
                                  return True
                          
                              def rowCount(self, parent=QtCore.QModelIndex()): 
                                  return len(self._df.index)
                          
                              def columnCount(self, parent=QtCore.QModelIndex()): 
                                  return len(self._df.columns)
                          
                              def sort(self, column, order):
                                  colname = self._df.columns.tolist()[column]
                                  self.layoutAboutToBeChanged.emit()
                                  self._df.sort_values(colname, ascending= order == QtCore.Qt.AscendingOrder, inplace=True)
                                  self._df.reset_index(inplace=True, drop=True)
                                  self.layoutChanged.emit()
                          
                          J 1 Reply Last reply 17 Jun 2021, 11:26
                          0
                          • P praneshpk
                            17 Jun 2021, 09:59

                            I'm getting contents in a fixed size, I need this to be changed manually or dynamically.

                            def button_click(self):
                                client = MongoClient("mongodb://localhost:27017/", username="sunadmin", password="sunpassword")
                                db = client['mail_test']
                                collection = db.mail_test
                                df = pd.DataFrame(list(collection.find()))
                                df = df.filter(["sub_body"])
                                print(df)
                            
                                model = PandasModel(df)
                                self.tableView.setModel(model)
                            

                            and the model file is ,

                            from PyQt5 import QtCore
                            import pandas as pd
                            
                            class PandasModel(QtCore.QAbstractTableModel): 
                                def __init__(self, df = pd.DataFrame(), parent=None): 
                                    QtCore.QAbstractTableModel.__init__(self, parent=parent)
                                    self._df = df
                            
                                def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
                                    if role != QtCore.Qt.DisplayRole:
                                        return QtCore.QVariant()
                            
                                    if orientation == QtCore.Qt.Horizontal:
                                        try:
                                            return self._df.columns.tolist()[section]
                                        except (IndexError, ):
                                            return QtCore.QVariant()
                                    elif orientation == QtCore.Qt.Vertical:
                                        try:
                                            # return self.df.index.tolist()
                                            return self._df.index.tolist()[section]
                                        except (IndexError, ):
                                            return QtCore.QVariant()
                            
                                def data(self, index, role=QtCore.Qt.DisplayRole):
                                    if role != QtCore.Qt.DisplayRole:
                                        return QtCore.QVariant()
                            
                                    if not index.isValid():
                                        return QtCore.QVariant()
                            
                                    return QtCore.QVariant(str(self._df.iloc[index.row(), index.column()]))
                            
                                def setData(self, index, value, role):
                                    row = self._df.index[index.row()]
                                    col = self._df.columns[index.column()]
                                    if hasattr(value, 'toPyObject'):
                                        # PyQt4 gets a QVariant
                                        value = value.toPyObject()
                                    else:
                                        # PySide gets an unicode
                                        dtype = self._df[col].dtype
                                        if dtype != object:
                                            value = None if value == '' else dtype.type(value)
                                    self._df.set_value(row, col, value)
                                    return True
                            
                                def rowCount(self, parent=QtCore.QModelIndex()): 
                                    return len(self._df.index)
                            
                                def columnCount(self, parent=QtCore.QModelIndex()): 
                                    return len(self._df.columns)
                            
                                def sort(self, column, order):
                                    colname = self._df.columns.tolist()[column]
                                    self.layoutAboutToBeChanged.emit()
                                    self._df.sort_values(colname, ascending= order == QtCore.Qt.AscendingOrder, inplace=True)
                                    self._df.reset_index(inplace=True, drop=True)
                                    self.layoutChanged.emit()
                            
                            J Offline
                            J Offline
                            JonB
                            wrote on 17 Jun 2021, 11:26 last edited by
                            #13

                            @praneshpk said in Connect to mongoDB and display data in table:

                            I'm getting contents in a fixed size, I need this to be changed manually or dynamically.

                            All of the stuff you show is for the model. Sizing is dealt with by the view. Whatever you want/need to do about that should be in the QTableView.

                            1 Reply Last reply
                            1
                            • P Offline
                              P Offline
                              praneshpk
                              wrote on 18 Jun 2021, 05:12 last edited by
                              #14
                              This post is deleted!
                              1 Reply Last reply
                              0

                              4/14

                              16 Jun 2021, 08:39

                              topic:navigator.unread, 10
                              • Login

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