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.9k 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 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