Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 14, 2018 10:31:40

man1985
Зарегистрирован: 2018-08-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Checkbox внутри QTableView не изменяет своего состояния при нажатии на него

Использую 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)

Офлайн

#2 Авг. 14, 2018 11:08:50

man1985
Зарегистрирован: 2018-08-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Checkbox внутри QTableView не изменяет своего состояния при нажатии на него

файл 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

Офлайн

#3 Авг. 14, 2018 12:37:54

man1985
Зарегистрирован: 2018-08-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Checkbox внутри QTableView не изменяет своего состояния при нажатии на него

С сортировкой проблема ушла при добавлении в цепочку QSortFilterProxyModel,т.е. теперь:
DB -> model -> QSortFilterProxyModel -> QTableView

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version