Przeniesienie zmiennej z jednej klasy do drugiej.

0

Witam, mam problem wydaje się banalny ale mi nie działa :D A więc tak, w skrócie mam dwa przyciski w jednej klasie wywołujące okienko i konkretną funkcję drugiej klasy.

Chcę w tej drugiej klasie rozróżnić który przycisk kliknął user. Więc spróbowałem normalnie po kliknięciu jednego przycisku ustawić zwykłego inta choice na 1 a przy kliknięciu drugiego na 2.

A więc dałem tego choice do headera i ustawiłem go przy tych przyciskach tak jak wyżej. W tej drugiej klasie wywołuje najprostszą funkcję int getChoice(ch) który returnuje choice'a .

Ustawiam ifa w drugiej klasie żeby odróżnił czy jest 1 czy 2 i wywala program. Z debuggera ogarnąłem, ustawiłem QMessageBoxa na else i wyskakuje on czyli wgl mi nie czyta tego choica.

Jaki błąd popełniłem?

2

Błąd w dizajnie. Dwa przyciski - dwa różne sygnały - dwie różne funkcje obsługujące je. Żadnych zmiennych dodatkowych.

Druga opcja to połączenie sygnałów clicked lamdą do dodatkowego sygnału z parametrem. Dla pierwszego przycisku lambda emit userAction(1) a dla drugiego emit userAction(2).

Zależnie od tego jak używasz obiektów pierwsza opcja może pasować bardziej, albo druga.

0
arciobus napisał(a):

Błąd w dizajnie. Dwa przyciski - dwa różne sygnały - dwie różne funkcje obsługujące je. Żadnych zmiennych dodatkowych.

Druga opcja to połączenie sygnałów clicked lamdą do dodatkowego sygnału z parametrem. Dla pierwszego przycisku lambda emit userAction(1) a dla drugiego emit userAction(2).

Zależnie od tego jak używasz obiektów pierwsza opcja może pasować bardziej, albo druga.

Wiesz co ogólnie początkowo tak założyłem, ale chciałem być wiesz Quality Code i nie redundować więc robię tak, ale skoro mówisz że tak to nie będzie lambd i wgl c++11 nie ogarniam to napiszę drugą funkcję, w sumie nie będzie to dużo kodu bo każdą praktycznie część kodu mam jako voida :D Dzięki

2

Dwa przyciski, dwa różne sygnały, które można podłączyć do rożnych slotów dowolnego obiektu, ot cała filozofia.
Nie bardziej sensownego nie napiszę, bo za bardzo nie rozumiem tego ponglisha, a przede wszystkim dlatego, że nie ma kodu do skomentowania.

A najlepiej by było, jakbyś opisał co chcesz osiągnąć.

1

Ja stosuję taki myk:

  • nazywam sobie obiekty które mogą przesłać sygnał do tego samego slotu poprzez setName(const QString &)
  • w slocie używam metody sender() która zwraca mi wskaźnik na obiekt który wysłał sygnał, albo 0 jeśli sygnału nie było. Potem na tym wskaźniku robię wskaźnik->name() i już wiem, od jakiego obiektu sygnał przyszedł. Użyteczne np w przypadku QPushButtonów, których sygnał clicked nie posiada parametru.
0
MarekR22 napisał(a):

Dwa przyciski, dwa różne sygnały, które można podłączyć do rożnych slotów dowolnego obiektu, ot cała filozofia.
Nie bardziej sensownego nie napiszę, bo za bardzo nie rozumiem tego ponglisha, a przede wszystkim dlatego, że nie ma kodu do skomentowania.

A najlepiej by było, jakbyś opisał co chcesz osiągnąć.

No nie chcę pisać nowej klasy na edita po prostu gdyż tu mam w większości gotowe funkcje.

void Adding::on_btnok_clicked()
{
    database_open();
    database_valid();
}

void Adding::database_valid()
{
    if (db.open())
    {
        Supplies_menu sup1;
        if (cho==1)
        {
            getName();
            if (nm!="")
            {
                getAll();
                database_add();
                if(query.exec())
                {
                    QMessageBox::information(this,"Adding to database","Succefully added");
                    accept();
                }
                else
                    QMessageBox::warning(this,"Adding to database","Could not add product to the database. Try again!");
            }
            else
            {
                ui->lnname->setStyleSheet(
                            "QLineEdit { "
                            "background-color:rgb(133, 133, 133);}");           
                QMessageBox::warning(this,"Adding product","Name can't be empty!");
            }
            database_close();
        }/// IF CHO==1
        else QMessageBox::critical(this,"Something gone wrong!","Try again later");
        if (cho==2)
        {
            sup1.getSelectedRow(id);
        }
    }
    else
    {
        QMessageBox::warning(this,"Connecting to database","Database connection failed");
    }
}

Tu są voidy wywoływane już wewnątrz klasy w której chce sobie wybrać czy ma być edit czy add;

void Adding::database_add()
{
    query.prepare("INSERT INTO produkty (name,notes,kcal,carbonates,proteins,fats,weight,date,img)"
                  "VALUES(?,?,?,?,?,?,?,?,?) ");
    query.addBindValue(nm);
    query.addBindValue(nt);
    query.addBindValue(kc);
    query.addBindValue(car);
    query.addBindValue(pro);
    query.addBindValue(fa);
    query.addBindValue(wei);
    query.addBindValue(dat);
    query.addBindValue(icon);

}
void Adding::database_edit()
{
       // int id;
        query.prepare("UPDATE produkty (name,notes,kcal,carbonates,proteins,fats,weight,date,img)"
                      " SET VALUES(?,?,?,?,?,?,?,?,?) WHERE productid="+id /* TUTAJ WSTAWIĆ */ );
        query.addBindValue(nm);
        query.addBindValue(nt);
        query.addBindValue(kc);
        query.addBindValue(car);
        query.addBindValue(pro);
        query.addBindValue(fa);
        query.addBindValue(wei);
        query.addBindValue(dat);
        query.addBindValue(icon);
}

A tu muszę jakoś zaznaczyć czy to jest ta jedynka czy dwójka i wysłać to do w/w klasy.

void Supplies_menu::on_btnadd_clicked()
{

    add.setModal(true);
    add.exec();
    table_display();
}

I ten cho to jest int pochodzący z tej klasy Adding tylko że nie działa bo wartości nie dostaje to go na razie z kodu wywaliłem.

1

Hmmm, ja tu jakoś ani połączenia sygnału ze slotem nie widzę, ani czym jest 'cho'. To z czym w końcu jest problem?

0
MasterBLB napisał(a):

Hmmm, ja tu jakoś ani połączenia sygnału ze slotem nie widzę, ani czym jest 'cho'. To z czym w końcu jest problem?

... Nie ogarniam już, zgubiłem się, o co z tym sygnałem chodzi, gdzie mam go podłączyć, cho jest intem.

1

Może inaczej. Jak wygląda u ciebie Bracie kod obsługujący wciśnięcie tych dwóch przycisków? Od tego zacznijmy.

0
MasterBLB napisał(a):

Może inaczej. Jak wygląda u ciebie Bracie kod obsługujący wciśnięcie tych dwóch przycisków? Od tego zacznijmy.

No po prostu wywołanie tej klasy.

void Supplies_menu::on_btnadd_clicked()
{

    add.setModal(true);
    add.exec();
    table_display();
}

void Supplies_menu::on_btnedit_clicked()
{

    QModelIndex x = ui->tableView->selectionModel()->selectedRows().first();
   /*INT*/ selectedRow = x.row();

   /// QObject::connect(this,SIGNAL(on_btnedit_clicked()),add,SLOT())
    add.setModal(true);
    add.exec();
}

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