Найти - Пользователи
Полная версия: Checkbox внутри QTableView не изменяет своего состояния при нажатии на него
Начало » Python для новичков » Checkbox внутри QTableView не изменяет своего состояния при нажатии на него
1
man1985
Использую 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
zone_db.py
 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)
man1985
файл 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
man1985
С сортировкой проблема ушла при добавлении в цепочку QSortFilterProxyModel,т.е. теперь:
DB -> model -> QSortFilterProxyModel -> QTableView
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB