Zaznaczenie w QSqlTableModel na QTableView

Odpowiedz Nowy wątek
2019-03-14 20:31
0

Witam, mam problem, u mnie w aplikacji jest funkcja edit przez którą edytuję się pewien obiekt. Wszystko działało na podstawie zaznaczenia w TableView i przenoszenia to do modela jako w sumie ten sam rekord przez id,
dopóki nie dodałem do programu możliwość sortowania w w QTableViewie :( teraz niestety wybiera mi rekord inny niż jest zaznaczony, myślałem długo i nie mam pomysłu jak to rozwiązać.

void Supplies_menu::on_btnedit_clicked()
{

    ///QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();
    //  ui->tableView->setSortingEnabled(true);
    if(ui->tableView->selectionModel()->hasSelection())
    {
        QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();

        if (index.isValid())
        {
            int selectedRow;
            selectedRow = index.row();
            Adding *add = new Adding(selectedRow,this);
            add->setModal(true);
            add->database_open();
            add->exec();
            table_display();
        }

        else {QMessageBox::critical(this,"error","error");}

    }
    else {
        QMessageBox::information(this,"Selection","You haven't selected any index");
    }
}

void Supplies_menu::on_btndel_clicked()
{
    if(ui->tableView->selectionModel()->hasSelection())
    {
        QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();

        if (index.isValid())
        {
            ////////////////////WPISZ TU DIALOG czxy jest siur
            int row = index.row();
            Adding *add = new Adding(row,this);
            add->database_open();
            add->database_delete();
            table_display();
        }
        else {
            QMessageBox::warning(this,"Selected Index","Your selection is wrong. Try again");
        }
    }
    else {
        QMessageBox::information(this,"Selection","You haven't selected any index");
    }
}
void Adding::database_edit()
{
    database_open();
    if(db.open())
    {
           query.prepare("SELECT * FROM produkty");
        MySqlTableModel *model = new  MySqlTableModel(this,db);
        query.exec();
        model->wywSetQuery(query);
        nm = model->record(IdInView).value("name").toString();
        nt = model->record(IdInView).value("notes").toString();
        QString Kc = model->record(IdInView).value("kcal").toString();
        QString Car = model->record(IdInView).value("carbonates").toString();
        QString Pro = model->record(IdInView).value("proteins").toString();
        QString Fa = model->record(IdInView).value("fats").toString();
        QString Wei = model->record(IdInView).value("weight").toString();
        dat = model->record(IdInView).value("date").toDate();
        iconT = model->record(IdInView).value("img").toByteArray();
        Type = model->record(IdInView).value("type").toString();
        IdInBase = model->record(IdInView).value("productid").toInt();

        ui->lnname->setText(nm);
        ui->lnnotes->setText(nt);
        ui->lnkcal->setText(Kc);
        ui->lncarbonates->setText(Car);
        ui->lnproteins->setText(Pro);
        ui->lnfats->setText(Fa);
        ui->lnweight->setText(Wei);

        if(Type=="1")
        {
            ui->btn1->setVisible(true);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(false);
        }
        else if(Type=="2")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(true);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(false);
        }
        else if(Type=="3")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(true);
            ui->btn4->setVisible(false);
        }
        else if(Type=="4")
        {
            ui->btn1->setVisible(false);
            ui->btn2->setVisible(false);
            ui->btn3->setVisible(false);
            ui->btn4->setVisible(true);
        }

        QImage image; image.loadFromData(iconT);
        ui->icon->setPixmap(QPixmap::fromImage(image));

        //img.loadFromData(Icon);
        // ui->icon->setPixmap(QPixmap::fromImage(img));

        // QVariant currentIcon = model->data(model->index(id,2),0);
        //  QByteArray bytes = currentIcon.toByteArray();

    }
    else QMessageBox::warning(this,"Connecting","Database conection failed!");
}

Tam potem jest dodawanie do database itd spokojnie ;)

Od razu zaznaczam że ledwo ja ogarniam co się w tym kodzie dzieje, bo go pisałem, wiem że jest masa redundancji, nieprawidłowych nazw czy zbędnego kodu ale nvm to pierwszy program, potem się poprawię ^^ - Xezolpl 2019-03-14 20:32

Pozostało 580 znaków

2019-04-15 10:16
0
tajny_agent napisał(a):

Jeśli używasz proxy to spróbuj najpierw zmapować indeks

auto proxyIndex = ui->tableView->selectionModel()->selectedIndexes().first();
auto x = proxyModel->mapToSource(proxyIndex).row();
   QSqlRecord rec = dbManager->getSqlTableModel()->record(x);
   int id = rec.value("productid").toInt();
   qDebug() << id;

QModelIndex QSortFilterProxyModel::mapToSource(const QModelIndex &proxyIndex) const

Tyle że mój model nie dziedziczy chyba z proxyModel, i ogólnie to nie mam takiej opcji (map to source) moj model tj tak

QAbstractItemModel* DbManager::imageTableModel()
{
    if (!m_budleDecodedModel && m_db.isOpen())
    {
        m_tableModel = new QSqlTableModel(this, m_db);
        m_tableModel->setTable("products");
        m_tableModel->select();

        m_sortingModel =new QSortFilterProxyModel(this);
        m_sortingModel->setDynamicSortFilter(true);
        m_sortingModel->setSourceModel(m_tableModel);

        m_budleDecodedModel = new SqlBlobDecoderModel(this);
        m_budleDecodedModel->setSourceModel(m_sortingModel);
        m_budleDecodedModel->setImageColumn(TableImageColumn);
    }
    return m_budleDecodedModel;
}

gdzie

class SqlBlobDecoderModel : public QIdentityProxyModel

/EDIT
Nawet próbując tak

   QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
   proxyModel->setSourceModel(dbManager->imageTableModel());
   auto proxyIndex = ui->tableView->selectionModel()->selectedIndexes().first();
   auto x = proxyModel->mapToSource(proxyIndex).row();
      QSqlRecord rec = dbManager->getSqlTableModel()->record(x);
      int xD = rec.value("productid").toInt();
      qDebug() << xD;

to wbija error że QSortFilterProxyModel: index from wrong model passed to mapToSource 0

edytowany 2x, ostatnio: Xezolpl, 2019-04-15 10:27

Pozostało 580 znaków

2019-04-16 11:11
0

Nie wiem jak, ale udało mi się rozwiązać ten problem samemu xD
żadne w/w sposoby nie zadziałały więc:
Productid czyli unikalny klucz dla produktu jest jako pierwszy w bazie danych
Normalnie mimo sortowania teraz działa bo gdy user klika przycisk to sortowanie robi się na ułamek sekundy ASC na product id, wtedy łapiemy numer indexu, bierzemy jego data() i zmieniamy na inta. Proste i aż serduszko cieszy ^^ (spędzało mi to sen z powiek przez 2tygodnie)

void Supplies_menu::on_btnedit_clicked()
{
   ui->tableView->sortByColumn(0,Qt::AscendingOrder);
   auto idx = ui->tableView->selectionModel()->selectedIndexes().first();
   QVariant var = dbManager->imageTableModel()->data(idx);
   int id = var.toInt();
   qDebug() << id;
   ui->tableView->sortByColumn(8,Qt::DescendingOrder);

   Product product(this);

   dbManager->getProductValuesFromDatabase(id);

   product.loadData(dbManager->getByteArray(),dbManager->getName(),dbManager->getNotes(),dbManager->getKcal(),
                    dbManager->getCarbonates(),dbManager->getProteins(),dbManager->getFats(),
                    dbManager->getWeight(),dbManager->getDate(),dbManager->getType());

   product.setModal(true);
   product.exec();

   if(dbManager->editProduct(product.getImageToByteArray(),product.getName(),product.getNotes(),product.getKcal(),
                         product.getCarbonates(),product.getProteins(),product.getFats(),
                         product.getWeight(),product.getDate(),product.getType(),id))
                           QMessageBox::information(this,"Success","Successfully applied changes to the product.");
   else QMessageBox::critical(this,"Editing error","Could not edit product in the database");
}

Teraz mimo sortowania czy usuniętych rekordów z bazy (bo productid idzie cały czas +1) wszystko działa poprawnie :)

  • 2.png (0,42 MB) - ściągnięć: 5
  • 3.png (0,32 MB) - ściągnięć: 5
  • 1.png (0,42 MB) - ściągnięć: 4
edytowany 2x, ostatnio: Xezolpl, 2019-04-16 11:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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