Foros del Web » Programando para Internet » Python »

Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Estas en el tema de Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna? en el foro de Python en Foros del Web. Buenas a todos queria saber como podria hacer para cuando uso QSqlTableModel que la primer columna en mi caso la primer columna que tiene las ...
  #1 (permalink)  
Antiguo 26/03/2012, 13:39
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 6 meses
Puntos: 0
Pregunta Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Buenas a todos queria saber como podria hacer para cuando uso QSqlTableModel que la primer columna en mi caso la primer columna que tiene las ID's no se pueda modificar?

Código:
self.ventana.var_select_model.setTable('items')
self.ventana.var_select_model.select()
self.ventana.var_select_model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
self.ventana.var_select_model.setHeaderData(1, QtCore.Qt.Horizontal, "Nombre")
self.ventana.var_select_model.setHeaderData(2, QtCore.Qt.Horizontal, "Cantidad")
self.ventana.var_select_model.setHeaderData(3, QtCore.Qt.Horizontal, "Precio")
self.ventana.tableView_ver_items.setModel(self.ventana.var_select_model)


Saludos.-
__________________
Página Principal: http://www.almightysystem.com.ar/
  #2 (permalink)  
Antiguo 27/03/2012, 11:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Esto te podría ayudar.
  #3 (permalink)  
Antiguo 27/03/2012, 12:35
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

No me ayudo mucho que digamos :(
__________________
Página Principal: http://www.almightysystem.com.ar/
  #4 (permalink)  
Antiguo 30/03/2012, 12:27
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Primero que nada, no pongas mensajes solo para subir la popularidad del post.
Segundo, si no te responden es por que no has puesto ni siquiera un código que se pueda ejecutar y ver cual es el error.

Después de investigar un poco, leer la documentación y de mas resulto ser muy sencillo.

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.assetModel = QSqlTableModel(self)
  13.         self.assetModel.flags = self.flags
  14.         self.assetModel.setEditStrategy(QSqlTableModel.OnRowChange)      
  15.         self.assetModel.setTable("testing")
  16.                
  17.         self.assetModel.select()
  18.         self.assetView = QTableView()
  19.        
  20.         self.assetView.setModel(self.assetModel)
  21.         self.assetView.setSelectionMode(QTableView.SingleSelection)
  22.         self.assetView.setSelectionBehavior(QTableView.SelectRows)
  23.        
  24.         dataLayout = QVBoxLayout()    
  25.         dataLayout.addWidget(self.assetView, 1)
  26.         layout = QHBoxLayout()
  27.         layout.addLayout(dataLayout, 1)
  28.         self.setLayout(layout)
  29.  
  30.         self.setWindowTitle("Asset Manager")
  31.        
  32.     def flags(self, idx):
  33.         baseflags = QAbstractTableModel.flags(self.assetModel, idx)
  34.         if idx.column() == 1:
  35.             return baseflags | Qt.ItemIsEditable
  36.         else:
  37.             return baseflags
  38.  
  39.  
  40. if __name__ == '__main__':
  41.  
  42.     app = QApplication(sys.argv)
  43.  
  44.     filename = os.path.join(os.path.dirname(__file__), "test.db")
  45.     create = not QFile.exists(filename)
  46.     db = QSqlDatabase.addDatabase("QSQLITE")
  47.     db.setDatabaseName(filename)
  48.     if not db.open():
  49.         QMessageBox.warning(None, "Asset Manager",
  50.             QString("Database Error: %1").arg(db.lastError().text()))
  51.         sys.exit(1)
  52.  
  53.    
  54.     print "Creating table..."
  55.     query = QSqlQuery()
  56.     r = query.exec_('drop table testing')
  57.     r = query.exec_("""CREATE TABLE testing (
  58.                id INTEGER,
  59.                value VARCHAR(20)
  60.                )""" )
  61.                
  62.     query.exec_("INSERT INTO testing (id, value) "
  63.                 "VALUES (1, '2')")
  64.     query.exec_("INSERT INTO testing (id, value) "
  65.                 "VALUES (3, '4')")
  66.  
  67.     m = MainForm()
  68.     m.show()
  69.    
  70.     app.exec_()
Básicamente es el link que te había pasado el mi primer respuesta.
  #5 (permalink)  
Antiguo 30/03/2012, 23:54
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

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.

Segundo puse un código de ejemplo del select usando el tablemodel, pense que era agregar algún atributo como .hideColumn(5)

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?


Ahora segun el ejemplo lo arme quedando asi:

Código:
    def warehouse_ejecutar_query_ver_items(self):
        self.ventana.data_base.open()
        winsound.PlaySound("SystemAsterisk", winsound.SND_ASYNC)
        self.ventana.var_select_model = QtSql.QSqlTableModel(self) 
        self.ventana.var_select_model.flags = self.flags
      self.ventana.var_select_model.setEditStrategy(QSqlTableModel.OnRowChange)
        self.ventana.var_select_model.setTable('items')
        self.ventana.var_select_model.select()
        self.ventana.var_select_model.setHeaderData(0, QtCore.Qt.Horizontal, "ID")
        self.ventana.var_select_model.setHeaderData(1, QtCore.Qt.Horizontal, "Nombre")
        self.ventana.var_select_model.setHeaderData(2, QtCore.Qt.Horizontal, "Cantidad")
        self.ventana.var_select_model.setHeaderData(3, QtCore.Qt.Horizontal, "Precio")
        self.ventana.var_select_model.setHeaderData(4, QtCore.Qt.Horizontal, "Ultima Modificación")
        self.ventana.var_select_model.setHeaderData(5, QtCore.Qt.Horizontal, "IP")
        self.ventana.tableView_ver_items.setModel(self.ventana.var_select_model)
        self.ventana.tableView_ver_items.hideColumn(5)
        
    def flags(self, idx):
        self.ventana.baseflags = QAbstractTableModel.flags(self.ventana.var_select_model, idx)
        if idx.column() == 1:
            return self.ventana.baseflags | Qt.ItemIsEditable
        else:
            return self.ventana.baseflags
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
__________________
Página Principal: http://www.almightysystem.com.ar/
  #6 (permalink)  
Antiguo 01/04/2012, 23:20
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
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_()
  #7 (permalink)  
Antiguo 04/04/2012, 12:36
 
Fecha de Ingreso: octubre-2010
Mensajes: 73
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Python 3 + PyQt4 ¿Propiedad NoEditTriggers para una sola columna?

Espectacular me sirvió , Groso razpeitia.




Gracias =)
__________________
Página Principal: http://www.almightysystem.com.ar/

Etiquetas: noedittriggers, onsterion, pyqt4, python3
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:13.