Ver Mensaje Individual
  #6 (permalink)  
Antiguo 01/04/2012, 23:20
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 2 meses
Puntos: 1360
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Cita:
Iniciado por Onsterion Ver Mensaje
Primero no creo que valla ser muy popular en un post donde pongo que no se hacer algo y que soy nuevo en python, si lo hago es por que paso más de un día y no veo otra respuesta viendo que hay gente que sabe como vos.
Lo que pasa es que esto va en contra de las políticas del foro, ademas de ser una mala practica. Ver bump.

Cita:
Iniciado por Onsterion Ver Mensaje
Segundo puse un código de ejemplo del select usando el tablemodel, pense que era agregar algún atributo como .hideColumn(5)
Como dije antes, el ejemplo ni siquiera corría. No esperes una respuesta muy acertada o rápida, si no das mucha información / planteamiento del problema.

Cita:
Iniciado por Onsterion Ver Mensaje
Pregunta vos importas =>

Código:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtSql import *
Yo lo importo

Código:
from PyQt4 import QtCore, QtGui, QtSql
no es lo mismo? o como es el tema?
Ok, no es lo mismo. Lo ideal sería hacer lo siguiente:

Código Python:
Ver original
  1. from PyQt4 import QtCore
  2. from PyQt4 import QtGui
  3. from PyQt4 import QtSql

Lo que hago en el import *, es incluir todas las clases, funciones, variables o incluso otros modulos que pueda tener ese modulo. Mientras lo que tu haces es incluir solamente lo necesario. Te recomiendo que te quedes con tu técnica, no solamente por que la recomienda la guía de estilo, si no por que ademas sabes que tienes en tu namespace y no terminas teniendo un desastre como en java o php.

Ver PEP-8 o guía de estilo.

Como nota adicional, yo no escribí el código (de hecho no he trabajado con pyqt4), solo fue copia de un código que mostraba el uso del modulo QSqlTableModel, después lo modifique para que funcionara lo de las columnas no editables.

Cita:
Iniciado por Onsterion Ver Mensaje
Ahora segun el ejemplo lo arme quedando asi:

Código:
mucho codigo aqui
Y ahora todas las casillas con números (INT) no son más editables y los "VARCHAR" si me los deja editar, habria alguna forma de espesificarle que solo afecte a la primer columna?

Gracias por la ayuda
Ups, lo siento, creo que me equivoque el código de ejemplo. Aquí esta el nuevo código, corregí el fallo y ademas agregue cambios para que sean varias columnas.
Código Python:
Ver original
  1. from PyQt4.QtCore import *
  2. from PyQt4.QtGui import *
  3. from PyQt4.QtSql import *
  4. import sys
  5. import os
  6.  
  7. class MainForm(QDialog):
  8.  
  9.     def __init__(self):
  10.         super(MainForm, self).__init__()
  11.  
  12.         self.not_editable_columns = [0, 2]
  13.         self.assetModel = QSqlTableModel(self)
  14.         self.assetModel.flags = self.flags
  15.         self.assetModel.setEditStrategy(QSqlTableModel.OnRowChange)      
  16.         self.assetModel.setTable("testing")
  17.                
  18.         self.assetModel.select()
  19.         self.assetView = QTableView()
  20.        
  21.         self.assetView.setModel(self.assetModel)
  22.         self.assetView.setSelectionMode(QTableView.SingleSelection)
  23.         self.assetView.setSelectionBehavior(QTableView.SelectRows)
  24.        
  25.         dataLayout = QVBoxLayout()    
  26.         dataLayout.addWidget(self.assetView, 1)
  27.         layout = QHBoxLayout()
  28.         layout.addLayout(dataLayout, 1)
  29.         self.setLayout(layout)
  30.  
  31.         self.setWindowTitle("Asset Manager")
  32.        
  33.     def flags(self, idx):
  34.         baseflags = QAbstractTableModel.flags(self.assetModel, idx)
  35.         if idx.column() in self.not_editable_columns:
  36.             return baseflags
  37.         else:
  38.             return baseflags | Qt.ItemIsEditable
  39.  
  40.  
  41. if __name__ == '__main__':
  42.  
  43.     app = QApplication(sys.argv)
  44.  
  45.     filename = os.path.join(os.path.dirname(__file__), "test.db")
  46.     create = not QFile.exists(filename)
  47.     db = QSqlDatabase.addDatabase("QSQLITE")
  48.     db.setDatabaseName(filename)
  49.     if not db.open():
  50.         QMessageBox.warning(None, "Asset Manager",
  51.             QString("Database Error: %1").arg(db.lastError().text()))
  52.         sys.exit(1)
  53.  
  54.    
  55.     print "Creating table..."
  56.     query = QSqlQuery()
  57.     r = query.exec_('drop table testing')
  58.     r = query.exec_("""CREATE TABLE testing (
  59.                id INTEGER,
  60.                value1 VARCHAR(20),
  61.                 value2 INTEGER,
  62.                 value3 VARCHAR(20)
  63.                )""" )
  64.                
  65.     query.exec_("INSERT INTO testing (id, value1, value2, value3) "
  66.                 "VALUES (1, '2', 3, '4')")
  67.     query.exec_("INSERT INTO testing (id, value1, value2, value3) "
  68.                 "VALUES (5, '6', 7, '8')")
  69.  
  70.     m = MainForm()
  71.     m.show()
  72.    
  73.     app.exec_()