QFilter nie działa

0

Dzień dobry, przychodzę z problemem który mnie wyprowadził już z równowagi. Próbowałem na wszystkie znane mi sposoby ale nie da rady... Mam bazę danych w niej tabela folders(int folderid, string name). Wczytuję foldery utworzone wcześniej z danych z DB i one są pushbuttonami. Po kliknięciu takiego buttona będę tam dalej kod stukał ale chodzi o to że po kliknięciu nie może mi odróżnić który to. Dlatego zdecydowałem się na użycie setObjectName() i później w slocie sender()->objectName();
Czyli mam QStringa i tutaj jest problem, daje go jako filtr do QSqlTableModel ale niestety nie działa (bawiąc się z qDebugiem normalnie pokazuje mi btnName ale już jak ustawie go jako filtr wiedząc że w DB mam tam taki rekord to nie znajduje. Proszę o pomoc :/

button dodający nowy folder

void Protocols::on_btnadd_clicked()
{
    /// if jesteśmy w folderach
    if((ui->nameln->text() == "Folder name")||(ui->nameln->text().isEmpty()))
    {
        foldersmodel = dbManager->getFoldersTableModel();
        int x = foldersmodel->rowCount();
        int b=1;
        for (int i=0; i<x;)
        {
            if(dbManager->getNameFromArray(i)=="New folder") b++;
            if(dbManager->getNameFromArray(i)== "New folder "+QString::number(b)) b++;
           // else continue;
            i++;
        }
        if(b==1) createFolder("New folder",true);
        else createFolder("New folder "+QString::number(b),true);
    }
    else
        createFolder(ui->nameln->text(),true);
    ui->nameln->clear();
}

slot od klikniętego folderu

void Protocols::onBtnFolderClicked(bool checked)
{
   Q_UNUSED(checked);

   hideAllWidgets(lay);
   ///wyswietl droge powrotną (jakas szczałka do tyłu czy coś)

   QString btnName = sender()->objectName();
   ///dobieranie nazwy do id folderu -> wyswietl jego zawartosc

   //foldersmodel->setFilter("name="+btnName);

   //qDebug()<< foldersmodel->record(0).value("folderid").toInt();


}

createfolder()

void Protocols::createFolder(QString name, bool toDatabase)
{
    Folder *fold = new Folder(nullptr,name);
    lay->addLayout(fold->getFolder(),rowcounter,columncounter);

    ui->scrollArea->setWidget(ui->scrollgrid);
    ui->scrollgrid->setLayout(lay);

    columncounter++;
    if(columncounter==4)
    {
        columncounter=0;
        rowcounter++;
    }
    justcounter++;

    connect(fold->getBtn(), &QPushButton::clicked, this, &Protocols::onBtnFolderClicked);

    ///czy dodać go do database?
    if(toDatabase)
        dbManager->addFolder(name);


}

w konstruktorze do zrobienia tych buttonów z DB

foldersmodel = dbManager->getFoldersTableModel();
    int x = foldersmodel->rowCount();

    for (int i=0; i<x;i++)
    {
        createFolder(dbManager->getNameFromArray(i));
    }
}

menadżer DB

QSqlTableModel *DbManager::getFoldersTableModel()
{
    QSqlTableModel *foldersmodel = new QSqlTableModel(this,m_db);
    foldersmodel->setTable("folders");
    foldersmodel->select();
    return foldersmodel;
}

oraz sama klasa folder

#include "folder.h"

Folder::Folder(QObject *parent, QString name)
{
    folderbtn = new QPushButton;
    folderbtn->setIcon(QIcon(":/images/images/folder.jpg"));
    folderbtn->setMaximumSize(120,120);
    folderbtn->setMinimumSize(120,120);
    folderbtn->setIconSize(QSize(120,120));

    folderlbl = new QLabel;
    folderlbl->setAlignment(Qt::AlignHCenter);
    folderlbl->setText(name);
    folderlbl->setMaximumSize(120,20);
    folderlbl->setMinimumSize(120,20);

    folderbtn->setObjectName(name);
    qDebug()<<folderbtn->objectName()<<name;
    layout = new QVBoxLayout;
    layout->addWidget(folderbtn);
    layout->addWidget(folderlbl);
    layout->SetFixedSize;

    dbMng = new DbManager;

}

QVBoxLayout *Folder::getFolder()
{
    return layout;
}

QPushButton *Folder::getBtn()
{
    return folderbtn;
}
1

A tutaj ( //foldersmodel->setFilter("name="+btnName);) przypadkiem nie zapomniałeś o cudzysłowie?

Najbezpieczniej to chyba użyć:

foldersmodel->setFilter(QString("name='%1'").arg(btnName));

E:
Stringi w SQL muszą być objęte w cudzysłowie/apostrofach. W zapisie "name="+btnName ich brakuje bo wynikiem tego jest name=nazwaprzycisku. A pożądany rezultat to name='nazwaprzycisku'.

Masz kilka możliwości sklejania stringów:

  • w stylu printf czyli za pomocą funkcji QString::arg()
  • w stylu stringstream czyli za pomocą klasy QTextStream
  • w stylu arytmentycznym czyli z wykorzystaniem operator+
  • QStringBuilder (najefektywniejszy, ale nie zgłębiałem się w temat)
QString surname("Trump");
QString country("USA");

// styl printf
QString result = QString("Donald %1 jest prezydentem %2").arg(surname).arg(country);

// styl stringstream`
QString result;
QTextStream(&result) << "Donald " << surname << " jest prezydentem " << country;

// styl arytmetyczny
QString result = "Donald " + surname + " jest prezydentem " + country;

1 użytkowników online, w tym zalogowanych: 0, gości: 1