Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. QTableView
Qt 6.11 is out! See what's new in the release blog

QTableView

Scheduled Pinned Locked Moved Unsolved Spanish
3 Posts 2 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • lincolnL Offline
    lincolnL Offline
    lincoln
    wrote on last edited by lincoln
    #1

    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);
        }
        
    }
    

    Solitary wolf

    1 Reply Last reply
    0
    • lincolnL Offline
      lincolnL Offline
      lincoln
      wrote on last edited by
      #2

      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!!!

      Solitary wolf

      juankiJ 1 Reply Last reply
      1
      • lincolnL lincoln

        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!!!

        juankiJ Offline
        juankiJ Offline
        juanki
        Moderators
        wrote on last edited by
        #3

        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

        Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
        Procura escribir correctamente y sin faltas de ortografía.

        Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved