QTableView



  • buenas tardes con todos, tengo lo siguiente un QDialog con un QTableView y un QLabel; entonces lo que hice fue conectarme a una base de datos, donde tengo guardadas imágenes, estas imágenes, la información de estas imágenes las muestro en filas en el QTableView y cada vez que selecciono una de ellas la imagen correspondiente se muestra en el QLabel, hasta ahí todo genial; mi pregunta es como hago lo mismo cuando paso por cada fila del QTableView, osea cuando uso las teclas arriba y abajo, por que cuando hago eso no se muestra nada en el QLabel, estuve intentado varias cosas pero no resulto, espero puedan ayudarme es para un proyecto de la universidad, apreciaría mucho cualquier ayuda, gracias de antemano.

    espero haberme dado a entender.

    Nota:
    dejo el codigo fuente aqui.

    el codigo del mi form principal.

    #ifndef PRINCIPALFRM_H
    #define PRINCIPALFRM_H
    
    #include <QDialog>
    #include <QSqlDatabase>
    #include <QFile>
    #include <QSqlTableModel>
    namespace Ui {
    class PrincipalFrm;
    }
    
    class PrincipalFrm : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit PrincipalFrm(QWidget *parent = nullptr);
        ~PrincipalFrm();
    
    private slots:
        void on_toolButton_clicked();
    
        void on_pushButton_clicked();
        void on_tableView_clicked(const QModelIndex &index);
        void on_pushButton_2_clicked();
    
    private:
        Ui::PrincipalFrm *ui;
        QSqlDatabase db;
        QFile file;
        QSqlTableModel *model;
    };
    
    #endif // PRINCIPALFRM_H
    

    aqui el .cpp

    #include "principalfrm.h"
    #include "ui_principalfrm.h"
    #include <QMessageBox>
    #include <QSqlError>
    #include <QFileInfo>
    #include <QFileDialog>
    #include <QSqlQuery>
    #include <QKeyEvent>
    PrincipalFrm::PrincipalFrm(QWidget *parent) :
        QDialog(parent),ui(new Ui::PrincipalFrm)
    {
        ui->setupUi(this);
        db=QSqlDatabase::addDatabase("QPSQL");
        if(!db.isDriverAvailable("QPSQL")){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Ocurrio un error al cargar el controlador.\n").append(
                                      db.lastError().text()));
            return;
        }
        db.setHostName("127.0.0.1");
        db.setPort(5432);
        db.setDatabaseName("dbimagenes");
        db.setUserName("postgres");
        db.setPassword("2311046");
        if(!db.open()){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Ocurrio un error al abrir la base de datos.\n").append(
                                      db.lastError().text()));
            return;
        }
        model=new QSqlTableModel(this);
    
        model->setTable("imagenes");
        model->select();
        model->setHeaderData(1,Qt::Horizontal,"Nombre imagen");
        model->setHeaderData(2,Qt::Horizontal,"Descripcion imagen");
        model->setHeaderData(3,Qt::Horizontal,"Imagen");
        ui->tableView->setModel(model);
    //    setWindowFlags(Qt::Dialog|Qt::MSWindowsFixedSizeDialogHint|
    //                   Qt::WindowMinimizeButtonHint|Qt::WindowCloseButtonHint);
        setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
    
        ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
        ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
        ui->tableView->hideColumn(0);
    
        if(model->rowCount()==0){
            ui->pushButton_2->setEnabled(false);
        }
        ui->pushButton->setDefault(true);
        ui->pushButton_2->setShortcut(QKeySequence(Qt::Key_Q));
        ui->toolButton->setShortcut(QKeySequence(Qt::Key_A));
    
        ui->tableView->setColumnWidth(2,120);
    }
    
    PrincipalFrm::~PrincipalFrm()
    {
        delete ui;
    }
    
    void PrincipalFrm::on_toolButton_clicked()
    {
        QString fileName=QFileDialog::getOpenFileName(this,"Abrir un aimagen",
                                     QDir::rootPath(),"Imagenes (*.png *.jpg *.jpeg)");
        file.setFileName(fileName);
        if(fileName.isEmpty()){
            return;
        }
        ui->lineEdit->setText(fileName);
        file.setFileName(fileName);
        QPixmap pixmap(fileName);
        ui->lblFoto->setPixmap(pixmap.scaled(ui->lblFoto->size()));
    
    }
    void PrincipalFrm::on_pushButton_clicked()
    {
        if(ui->lineEdit->text().isEmpty()||ui->lineEdit_2->text().isEmpty()){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Complete todos los campos."));
            ui->lineEdit_2->setFocus();
            return;
        }
        QFileInfo info(file);
        if(!file.open(QIODevice::ReadOnly)){
            return;
        }
        QByteArray imagen=file.readAll();
        QSqlQuery qry;
        qry.prepare("INSERT INTO imagenes(nombre,descripcion,img) VALUES(?,?,?)");
        qry.addBindValue(info.fileName(),QSql::In);
        qry.addBindValue(ui->lineEdit_2->text(),QSql::In);
        qry.addBindValue(imagen,QSql::In);
        if(!qry.exec()){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Error de ejecucion.\n").append(
                                      qry.lastError().text()));
            return;
        }
        QMessageBox::information(this,qApp->applicationName(),
                                 "Datos gusrdados!");
        ui->lineEdit->clear();
        ui->lineEdit_2->clear();
        ui->lblFoto->clear();
        model->select();
        file.close();
        if(model->rowCount()!=0){
            ui->pushButton_2->setEnabled(true);
        }
    
    }
    /**
    aqui es donde muestro las imagenes en el QLabel, al hacer click en una fila del QTableView,
    quiero hacer lo mismo pero cuando me deslizo por cada fila del QTableView con las teclas de direccion,
    esa es la pregunta.
    **/
    void PrincipalFrm::on_tableView_clicked(const QModelIndex &index)
    {
        QSqlQuery qry;
        qry.prepare(("SELECT img FROM imagenes WHERE id_imagen=?"));
        qry.addBindValue(model->index(index.row(),0).data().toString());
        if(!qry.exec()){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Error de ejecucion.\n").append(
                                      qry.lastError().text()));
            return;
        }
        qry.next();
        QByteArray imagen=qry.value(0).toByteArray();
        QPixmap pixmap;
        pixmap.loadFromData(imagen);
        ui->lblFoto->setPixmap(pixmap.scaled(ui->lblFoto->size()));
    }
    
    void PrincipalFrm::on_pushButton_2_clicked()
    {
        QString nombre= model->index(ui->tableView->currentIndex().row(),1).data().toString();
       int res= QMessageBox::question(this,qApp->applicationName(),
                              QString("Seguro que quiere eliminar.").append("<h3>"+nombre+"</h3>"),
                                      QMessageBox::Yes|QMessageBox::No);
    
       if(res==QMessageBox::Yes){
           model->removeRow(ui->tableView->currentIndex().row());
           model->select();
           ui->tableView->selectRow(0);
       }
    
        if(model->rowCount()==0){
            ui->lblFoto->clear();
            ui->pushButton_2->setEnabled(false);
        }
        
    }
    


  • bueno como siempre, me contesto yo mismo.

    dejo el código por si alguien le hace falta.

    solo llame a la señal currentChanged, y con eso estuvo.

    QOBject::connect(ui->tableView->selectionModel, &QItemSelectionModel::currentChanged,this,[&](){
           QSqlQuery qry;
        qry.prepare(("SELECT img FROM imagenes WHERE id_imagen=?"));
        qry.addBindValue(model->index(ui->tableView->currentIndex().row(),0).data().toString());
        if(!qry.exec()){
            QMessageBox::critical(this,qApp->applicationName(),
                                  tr("Error de ejecucion.\n").append(
                                      qry.lastError().text()));
            return;
        }
        qry.next();
        QByteArray imagen=qry.value(0).toByteArray();
        QPixmap pixmap;
        pixmap.loadFromData(imagen);
        ui->lblFoto->setPixmap(pixmap.scaled(ui->lblFoto->size()));
    });
    

    ahí tienen el código, si es que a alguien le sirve, gracias de todos modos.
    hasta aquí no mas!!!


  • Moderators

    Hola @lincoln

    Gracias por compartir la solución, justo me viene bien, estaba mirando precisamente la forma de moverme por una tabla y saber en qué celda estoy y me vale esa solución.

    Un saludo


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.