Qt - QTabWidget

0

W programie mam 2 zakładki klasy QTabWidget

W zakładce pierwszej tej po starcie programu mam obiekt klasy QTableView który jest składnikiem klasy MainWindow wyświetla pobrane rekordy z bazy i wygląda to tak

screenshot-20191121111621.png

poniżej kod

    StrQuery1 = "SELECT pStatus_zamowienia FROM tZamowienia2 WHERE pStatus_zamowienia = 'Nowe zamówienie'"
                " "
                "OR"
                " "
                "pStatus_zamowienia = 'W realizacji'"
                " "
                "OR"
                " "
                "pStatus_zamowienia is NULL";
    SqlQuery1 = new QSqlQuery(StrQuery1, *connect);
    SqlQuery1->exec();

    MyModel = new MySqlQueryModel();
    MyModel->setQuery(*SqlQuery1);

    TblView1->setModel(MyModel);
    TblView1->setAlternatingRowColors(true);

W druga zakładka też jest składnikiem klasy MainWindow i zapytanie mam podobne do poprzedniego, tylko różni się klauzulą WHERE

    StrQuery2 = "SELECT"
                " "
                "pStatus_zamowienia"
                " "
                "FROM"
                " "
                "tZamowienia2"
                " "
                "WHERE"
                " "
                "pStatus_zamowienia = 'Zrealizowane'";
    SqlQuery2 = new QSqlQuery(StrQuery2, *connect);
    SqlQuery2->exec();

    SqlModel = new QSqlQueryModel();
    SqlModel->setQuery(*SqlQuery2);

    TblView2->setModel(SqlModel);
    TblView2->setAlternatingRowColors(true);

napisałem sobie slota który jest składnikiem klasy MySqlQueryModel. Zadaniem tego slota jest odświeżanie danych zawartych w drugiej zakładce

i wygląda on tak

void MySqlQueryModel::refreshTab(int tab)
{
        if(tab==1){
        setQuery("SELECT"
                 " "
                 "pStatus_zamowienia"
                 " "
                 "FROM"
                 " "
                 "tZamowienia2"
                 " "
                 "WHERE"
                 " "
                 "pStatus_zamowienia = 'Zrealizowane'");

        setHeaderData(6,Qt::Horizontal,QVariant(QString(QObject::tr("Status zamówienia"))),Qt::EditRole);
        qDebug()<<"odświeżam" << tab;
    }
}

a tak wygląda podłączenie tego slota w klasie MAinWindow

QObject::connect(mainTabWidget, &QTabWidget::currentChanged, MyModel, &MySqlQueryModel::refreshTab);

Przy przełączaniu się między zakładkami slot działa, co widać po komunikatach z qDebug który umieściłem w tym slocie ale problem jest taki, że zapytanie o wczytanie danych w ogóle nie działa, natomiast jak dodałem warunek if dla zakładki 0 (zero) to slot wykonywał się poprawnie i wczytywał dane z bazy.

Pytanie mam takie, dlaczego ten slot nie wczytuje danych dla zakładki drugiej ? (taby numerowane są od zera)

1

new QSqlQuery jest bezsensu w każdym kontekście. Tak samo jak new QString (obie klasy to są typy strukturalne - zachowujące się jak prosta wartość).
Utrudniasz sobie jedynie zarządzanie pamięcią.

Co od:

Przy przełączaniu się między zakładkami slot działa, co widać po komunikatach z qDebug który umieściłem w tym slocie ale problem jest taki, że zapytanie o wczytanie danych w ogóle nie działa, natomiast jak dodałem warunek if dla zakładki 0 (zero) to slot wykonywał się poprawnie i wczytywał dane z bazy.

Pytanie mam takie, dlaczego ten slot nie wczytuje danych dla zakładki drugiej ? (taby numerowane są od zera)

Co to znaczy: zapytanie o wczytanie danych? W załączonym kodzie nic takiego nie widzę. if też nie widzę.

0

Zapytanie o wczytanie danych ? Więc poniżej jest slot. W poprzednim poście jest on na samym końcu. Na Twoje życzenie dorobiłem drugi warunek jeden dla taba 0, drugi dla taba 1

dla taba 0 slot wykonuje się poprawnie
dla taba 1 nie działa w ogóle

void MySqlQueryModel::refreshTab(int tab)
{
    if(tab==0){
        setQuery("SELECT"
                 " "
                 "pStatus_zamowienia"
                 " "
                 "FROM"
                 " "
                 "tZamowienia2"
                 " "
                 "WHERE"
                 " "
                 "pStatus_zamowienia = 'Nowe zamówienie'"
                 " "
                 "OR"
                 " "
                 "pStatus_zamowienia = 'W realizacji'"
                 " "
                 "OR"
                 " "
                 "pStatus_zamowienia is NULL");
        qDebug()<<"odświeżam" << tab;
    }
    else if(tab==1){
        setQuery("SELECT"
                 " "
                 "pStatus_zamowienia"
                 " "
                 "FROM"
                 " "
                 "tZamowienia2"
                 " "
                 "WHERE"
                 " "
                 "pStatus_zamowienia = 'Zrealizowane'");
        setHeaderData(6,Qt::Horizontal,QVariant(QString(QObject::tr("Status zamówienia"))),Qt::EditRole);
        qDebug()<<"odświeżam" << tab;
    }
}
0

zastanawiam się, czy problem nie wynika z tego, że mam jeden wasny model MySqlQueryModel który dziedziczy po QSqlQueryModel ?

I jakbym zrobił dwa modele dla każdego taba z osobna które różnią się tylko zapytaniami do tej samej bazy ?

No to tak w ogóle zastanawiam się po co służą sygnały QTabWidget::currentChanged ? Skoro w tym przypadku nie ma z nich pożytku ?

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