Put data in TableView after SQl query
-
It's a part of function to put data from selected sql in combobox to table View.
Begins of it looks that:
def zestawienia (self): #obsługa zakładki zestawień con= self.dlg.comboBox_6.currentText() global model q= QSqlQueryModel() model = QTableView() res=QStandardItem() if con == Zest[0]: ...
It vision is easy- from combo box show SQL's anwser in TableView below
-
@Karoluss96 As I wrote: you are creating local variables, make them class members instead...
-
You mean by put some variables in definition of function - next to (self) in brackets?
Or put eg. ..setquery and insertColumns at the beginning before if loop? -
@Karoluss96 For example:
self.model = QTableView()
-
I've done:
self.q= QSqlQueryModel() self.model = QTableView() if con == Zest[0]: sql2 = "SELECT * FROM ZARZADZANIE.ZAMOWIENIA_WG_STATUS_V"#zapytanie nie działa :-( query.exec_(sql2) a=q.setQuery(sql2) self.dlg.tableView_5.setModel(a)
but i gains error in loof if: local variable 'q' referenced before assignment
-
@Karoluss96 said in Put data in TableView after SQl query:
local variable 'q' referenced before assignment
it is self.q now, not just q...
-
so where i have to put
self.model = QTableView()
as you suggested?
-
@Karoluss96 In the code you already posted!
def zestawienia (self): #obsługa zakładki zestawień con= self.dlg.comboBox_6.currentText() global model self.q= QSqlQueryModel() self.model = QTableView() res=QStandardItem() if con == Zest[0]:
-
@Karoluss96
You need to understand about things like variable scopes as a part of Python not Qt. Just saying.I see you still have a
QStandardItem
. I cannot imagine why. As I said, you simply fill your model from SQL and attach aQTableView
to it, that's it.And please do not name as
model
something which is aQTableView
, it's incredibly confusing. -
I changed assigning QTableView from model to table.
Then I put it intoself.dlg.tableView_5.setModel(table)
but it makes an error
TypeError: setModel(self, QAbstractItemModel): argument 1 has unexpected type 'QTableView'
-
@Karoluss96 said in Put data in TableView after SQl query:
but it makes an error
Would be nice if you would tell us what error it is...
-
I put the text of error in a previous post /\
-
@Karoluss96 The error is quite clear: you can't set QTableView (which is a view) as model...
What @JonB suggested is to use https://doc.qt.io/qt-6/qsqltablemodel.html or https://doc.qt.io/qt-6/qsqlquerymodel.html as model to get data from your SQL database and set that model in self.dlg.tableView_5 -
OK, now I have at beginning:
q= QSqlQueryModel() table = QSqlTableModel()
-
@Karoluss96
Why do you have both aQSqlQueryModel
and aQSqlTableModel
? Why two models?And you are assigning each of these to a function-local variable now. You will not be able to access these outside of this function, and they may be destroyed when they go out of scope.
-
Both I catch in one funtion, so I needn't put them global.
Now I have that:q= QSqlQueryModel() table = QSqlTableModel() self.dlg.tableView_3.show() if con == Zest[0]: sql2 = "SELECT * FROM ZARZADZANIE.ZAMOWIENIA_WG_STATUS_V" q=query.exec_(sql2) a=table.setQuery(q) self.dlg.tableView_5.setModel(a) print (a)
with an error: TypeError: setQuery(self, QSqlQuery): argument 1 has unexpected type 'bool'
-
@Karoluss96 said in Put data in TableView after SQl query:
q= QSqlQueryModel()
table = QSqlTableModel()I'm wondering how often we need to write that you are creating local variables which are destroyed as soon as the method finishes?
And did you actually read what @JonB wrote? Again: why do you have QSqlQueryModel AND QSqlTableModel?
Why are you overwriting q here:
q=query.exec_(sql2)
?
You should really think more about what you are doing... -
OK, I read his suggestion, but still don't what is a problem in 'creating local variables which are destroyed as soon as the method finishes' - this variables exist only in this function
q=query.exec_(sql2) come from different function in my app, which execute query in assigned variable, that have the SQL command as a string.
Now the error is little different: TypeError: setQuery(self, QSqlQuery): argument 1 has unexpected type 'str'
-
@Karoluss96 said in Put data in TableView after SQl query:
but still don't what is a problem in 'creating local variables which are destroyed as soon as the method finishes'
Simple: your models (q and table) will be destroyed as soon as the method finishes, so your tableView_5 will not show anything.
"q=query.exec_(sql2) come from different function in my app" - don't just copy/paste something without thinking about what you are doing.
"Now the error is little different" - please, if you get an error show also the code causing this error!
-
Problem is in last line of this code:
sql2 = "SELECT * FROM ZARZADZANIE.ZAMOWIENIA_WG_STATUS_V" q=query.exec_(sql2) print (q) c=self.dlg.tableView_5.setModel(q)
I don't know why q is converted from string to bool.
If I put in setModel sql2 instead of q it shout that here can be the stringabout sentance: " models (q and table) will be destroyed as soon as the method finishes, so your tableView_5 will not show anything." what do you propose?