Форум сайта python.su
0
Использую PyQt
Делается связка DB -> model -> QTableView
model - перегружаю класс QSqlQueryModel.
В методе flags выставляю флаги flags |=ItemIsUserCheckable, чтоб появился чекбокс в ячейке.
В методе data для DisplayRole возвращаю None, чтоб видеть только чекбокс во 2-м столбце и не видеть данные.
Чекбокс при нажатии на него не меняет своего состояния.
Как сделать, чтоб чекбокс менял состояние при нажатии на него?
Не работает сортировка по столбцам в QTableView, несмотря на то, что выставлен setSortingEnabled
Как сделать работающей сортировку по столбцам в QTableView
Аналогичный код в QtCreator на С++ работает
editablesqlmodel.py
from PyQt5 import QtCore, QtGui, QtWidgets, QtSql class EditableSqlModel(QtSql.QSqlQueryModel): def __init__(self): super().__init__() def flags(self, index): flags = super(EditableSqlModel, self).flags(index) if index.column() in (0,1): flags |= QtCore.Qt.ItemIsEditable elif (index.column() == 2): #flags |= QtCore.Qt.ItemIsUserCheckable flags | = QtCore.Qt.ItemIsUserCheckable return flags def data(self,index, role=QtCore.Qt.DisplayRole): if not index.isValid(): return None data=super(EditableSqlModel,self).data(index,role) if index.column()==2: if role != QtCore.Qt.DisplayRole: data1=super(EditableSqlModel,self).data(index,QtCore.Qt.DisplayRole) val = QtCore.Qt.Checked if data1 else QtCore.Qt.Unchecked return val else: return None else: return data
import sys from PyQt5.QtWidgets import QApplication, QAction, QWidget from PyQt5 import QtCore, QtGui, QtWidgets, QtSql from PyQt5 import QtGui, QtCore from editablesqlmodel import EditableSqlModel import connection from PyQt5.uic import loadUi class mw(QWidget): def __init__(self): super().__init__() self.wd=loadUi('mainwindow.ui') self.wd.show() def algs(self): self.model=EditableSqlModel() try: self.model.setQuery('SELECT КодAlg,NAME,AddV FROM Alg',self.db) if self.model.lastError().isValid(): print(self.model.lastError().text()) self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Алгоритм") self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Пометка") self.model.query() self.wd.tableView.setModel(self.model) self.wd.tableView.setSortingEnabled(True); #print(self.model.record(1).value(1)) self.wd.tableView.show() except Exception as err: print(err) return True def createMenus(self): msgAction = QAction("Алгоритмы",self.wd.menuBar) msgAction.triggered.connect(self.algs) self.wd.menuBar.addAction(msgAction) def main(args): app=QApplication(sys.argv) mw1=mw() mw1.createMenus() db_file = r'''D:\block_prog_06_11_17.accdb''' mw1.db=connection.createConnection(db_file) if not mw1.db: sys.exit(1) sys.exit(app.exec_()) if __name__ == '__main__': main(sys.argv)
Офлайн
0
файл connection.py
import pyodbc from PyQt5.QtSql import QSqlQueryModel,QSqlDatabase,QSqlQuery def createConnection(db_file): try: user = '' password = '' odbc_conn_str = 'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;' %\ (db_file) db = QSqlDatabase.addDatabase("QODBC") db.setDatabaseName("DRIVER=Microsoft Access Driver (*.mdb, *.accdb);FIL=MS Access;DBQ=d:\\QtPrj\\Zone_db\\Zone_test.accdb") #----------------------- if not db.open(): print("Can't open database") return None #conn = pyodbc.connect(odbc_conn_str) return db except Exception as err: print(err) return None
Офлайн
0
С сортировкой проблема ушла при добавлении в цепочку QSortFilterProxyModel,т.е. теперь:
DB -> model -> QSortFilterProxyModel -> QTableView
Офлайн