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

Connect to mongoDB and display data in table

Scheduled Pinned Locked Moved Unsolved Qt for Python
14 Posts 4 Posters 3.0k 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 praneshpk

    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()
    
    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on 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 last edited by
      #3

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

      JonBJ 1 Reply Last reply
      0
      • P praneshpk

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

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on 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 last edited by
          #5

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

          JonBJ 1 Reply Last reply
          0
          • P praneshpk

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

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on 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 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

              JonBJ 1 Reply Last reply
              0
              • P praneshpk

                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

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on 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 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
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 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 last edited by
                      #11

                      No, it is inside stacked pages widget

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        praneshpk
                        wrote on 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()
                        
                        JonBJ 1 Reply Last reply
                        0
                        • P praneshpk

                          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()
                          
                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on 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 last edited by
                            #14
                            This post is deleted!
                            1 Reply Last reply
                            0

                            • Login

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