Hacer consultas Sql en una función de otra clase en Qt C++



  • Hola buen dia, estoy aprendiendo a programar con qt, no estoy muy familiarizado con c++, sin embargo la entiendo un poco mas que java. La cuestión es lo siguiente, quiero hacer una consulta en una función o método en otra clase, y después llenar el QTableView, yo en VB.net acostumbraba a pasar el control como un parámetro ejemplo:

    En el Formulario:

    Dim Consultar as Clase_Consulta()

    Consultar.clientes(ListView)

    En la Clase:

    Public sub clientes(ByVal ListView1 as ListView)

    ****BLA BLA BLA

    Ahi podia hacer la consulta y llenar el control

    Estuve investigando por internet la forma de hacer esto en Qt, claro en QTableView y he visto que esta no es la forma correcta de utilizar las clases, seria mejor crear una funcion que te devuelva esos datos y LLENARLO EN FORMULARIO "NO EN LA CLASE", ahora como podria hacer esto? intente hacer esto:

    conexiones.h

    class Conexiones
    {
    public:

    bool Conectar();
    QSqlQueryModel model();


    conexiones.cpp

    bool Conexiones::Conectar()
    {
    int retornar;
    QString servername ="";
    QString dbname ="
    ";
    QString LoginN= "";
    QString Passw= "
    *";

    db = QSqlDatabase::addDatabase("QODBC", "BDSCAFI");

    db.setDatabaseName("DRIVER={SQL Server};Server="+servername+";Database="+dbname+";Uid="+LoginN+";Port=1433;Pwd="+Passw+";WSID=");

    if(db.open())
    {
    retornar=true;
    db.close();
    }
    else
    {
    retornar=false;

    }
    return retornar;
    }

    QSqlQueryModel Conexiones:: model(){

    if(conectar==true)
    {
    QSqlQueryModel *modelo = new QSqlQueryModel;
    modelo->setQuery("SELECT * FROMClientes", db);
    return modelo;
    }
    }


    MainWindow.cpp

    void MainWindow:: Conectar_TableView(){

    Conexiones *conec = new Conexiones();
    ui->tableView->setModel(*conec->model());

    }


    Pero el compilador me da error "no match for operator" en ui->tableView->setModel(*conec->model());, que estoy haciendo mal, o si hay una manera mejor de hacerlo, de antemano gracias



  • Hola

    Cuando haces setModel, tienes que quitar el asterisco, ya que ese método espera recibir un puntero. Y tienes que modificar también el método model de la clase Conexiones, ya que, aunque retorna un puntero, tu la has declarado que retorna un objeto de la clase QSqlQueryModel, por lo que también te dará error.

    En ese método tendrás también otro error o aviso y es que has metido el return dentro de la comprobación connectar== true. ¿Y si es false, qué retornas? Además, yo creo que esa comprobación está mal planteada, tendrías que hacerla justo antes de hacer el setModel, algo así:

    Conexiones *conec = new Conexiones();
    if(conec->hayConexion()) { // tendrías que crear ese método
        ui->tableView->setModel(conec->model());
    } else {
     // mostrar un aviso o un error al usuario
    }
    

    Personalmente, todas esas comprobaciones, si hay acceso a la base de datos y demás, las suelo hacer en el main, antes de crear la ventana principal, y si hay algún error o no se puede conectar, pues en vez de mostrar el MainWindow, pues muestro un mensaje de error y el programa termina.

    Un saludo


Log in to reply
 

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