Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Extract the data from table when selected.



  • Hello,
    I want to extract the data from a table when selected.
    20732b07-b657-417f-8278-1cd876c89eff-image.png
    in the picture above, what I currently got is: Once row 1 is selected, the button (2) will become available to click, and it will load up a new window. In that new window, I want to query 3 tables in my database for that Test_Identifier found in the row selected.

    What I am struggling with is, how to get the data from the table so I can then query it in the tables I have.


  • Qt Champions 2019

    Do you have a QTableWidget or QTableView?
    For QTableWidget: https://doc.qt.io/qt-5/qtablewidget.html#selectedItems
    For QTableView: https://doc.qt.io/qt-5/qabstractitemview.html#selectionModel



  • @Christian-Ehrlicher I am using QTableWidget, I have checked that documentation but its not very beginner-friendly.
    I gave it a go:

            selected_row = self.OverviewDatabaseTable.selectedItems()
            print(selected_row)
    

    to see what it would output, and I got this:
    054e008d-2b53-4ff6-a97b-0ebfeb83f364-image.png
    which i am guessing its the location of the items in that selected row. How can I get the text rather than that?


  • Lifetime Qt Champion

    @DouglinhasZN
    Hi its a list with the actual items
    so
    selected_row.at(x)->text gives the text. ( c++ syntax)

    If you only select one item, the list contains only one at index 0



  • @mrjj
    I think I am on the right tracks:

            row = self.OverviewDatabaseTable.currentRow() # Index of Row
            firstColumnInRow = self.OverviewDatabaseTable.item(row, 0) # returns QTableWidgetItem
            text = firstColumnInRow.text() # content of this
            print (str(text)) # if this is a index, you propably dont want it as text
    

    This will output exactly what I need in the terminal. I guess its just a matter of querying the database using "text"


  • Lifetime Qt Champion

    @DouglinhasZN

    Hi
    That should work fine too
    if you always just want first col's text regardless of the row
    and if the user clicks on some other celll on that row.

    Do note that cells can be real empty and then you get a NULL back and will crash on
    firstColumnInRow.text()

    so you should always check the returned item. (forgive my python noobness)

         row = self.OverviewDatabaseTable.currentRow() # Index of Row
        firstColumnInRow = self.OverviewDatabaseTable.item(row, 0) # returns QTableWidgetItem
        if firstColumnInRow is not None:
           text = firstColumnInRow.text() # content of this
           print (str(text)) # if this is a index, you propably dont want it as text


  • @mrjj Thank you, i've added that in even though the user wont be able to save if the field is empty. Always good to make sure.

    I have been attempting to query all my 3 tables for test_id :

        def Open_Selected_Finding(self):
            
                    whole_row = self.DatabaseTable.currentRow() # Index of Row
            
                    firstColumnInRow = self.DatabaseTable.item(whole_row, 0) # returns QTableWidgetItem
            
                    if firstColumnInRow is not None:
            
                        test_id_ = firstColumnInRow.text() # content of this
            
                        print (test_id_) # if this is a index, you propably dont want it as text
            
            
            
                    conn = sqlite3.connect('Main_Database.db')
            
                    content = 'SELECT * FROM Test_Details, CVE_Details,Findings WHERE Test_ID=?',(test_id_)
            
                    executing_content = conn.execute(content)
            
                    
            
                    self.window = QtWidgets.QDialog()
            
                    self.ui = Ui_FindingDetailWindow()
            
                    self.ui.setupUi(self.window)
            
                    self.window.show()
            
                    for  colm_index, colm_data in enumerate(executing_content):        
            
                            self.FindingWindowNameTextEdit.setText(str(colm_data))      
    

    The goal is to get all the content in every column from the row that contains the "test_id" selected.
    Then input that content into a new window:
    24a6a478-1ba5-4459-b0c4-1fbc5f4c2620-image.png


  • Lifetime Qt Champion

    Hi
    It might just be due to it being python but it looks odd to me as im used to the c++ way

    executing_content = conn.execute(content)

    Does that really return the selected rows from the database ?

    Normally execute just returns true / false to indicated if it went well or not.

    Normally it would be like

    query = QSqlQuery("SELECT country FROM artist")
    while query.next():
    country = query.value(0)

    Sorry if im just python noob and it does indeed work :)



  • @mrjj
    Perhaps, I was trying to use the code I used in another block that works fine.
    At this point I am just trying until it sticks. However, for the QSqlQuery wouldn't that require me to have used QSql to begin with? im using Sqlite3.
    4e5e753f-7b8b-48ab-93b4-38a688cc2f00-image.png
    That's the error I am getting. Unfortunately the documentation isn't very user-friendly, so ill have to keep bashing my head in this until it works

    Edit#1 - This is what I am using to select from the database using my variable:

    querying = 'SELECT * FROM Findings WHERE Test_ID=?', (test_id_)
    

    The question now is, how do I input the contents from that query to a new window

    Update#1 - Its working, but it isnt.
    This is my code:

            querying1 = c.execute('SELECT Test_ID FROM Findings WHERE Test_ID=?', (test_id_,))       
            
            self.window = QtWidgets.QDialog()
            self.ui = Ui_FindingDetailWindow()
            self.ui.setupUi(self.window)
            self.window.show()
            self.ui.FindingWindowNameTextEdit.setText(str(querying1))
    

    However, instead of outputting the actual text, it outputs this:
    7616704f-e060-4b59-9811-37d0e7093c76-image.png

    i got it

    ah that was easier than i thought

    for Test_ID, Name, Description, Remediation, Criticality, Type in querying1.fetchall():
    

    that was the key


Log in to reply