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

MMkey. A gdzie są w kodzie wywoływane te metody Supplies_menu::on_btnedit_clicked() oraz Supplies_menu::on_btnadd_clicked()

5

@Xezolpl: Byłoby nam o wiele prościej gdyby ten kod miał ręce i nogi. Nie obraź się, ale to co wrzuciłeś to jest masakra.

  1. Klasa Adding. Bóg wie co to jest i czym się zajmuje. Nazwa z tzw. czapki.
  2. Nie wiem dlaczego ukochałeś funkcje void. Ciężko się taki kod czyta, bo te funkcje niby nic nie zwracające modyfikują masę zmiennych. I trzeba się wczytywać dokładnie w kod, żeby wyśledzić kto, co, gdzie i jak modyfikuje.
  3. Funkcja database_valid. Tworzy jakiś obiekt, pobiera jakąś nazwę(czego?), dodaje dane do bazy, wyświetla messagebox, zmienia CSS, a nawet pobiera zaznaczone wiersze. Brakuje jeszcze, żeby skoczy skoczyła do sklepu po piwo i zamówiła pizzę :>. No i kolejny raz nazwa... albo isValid albo validate.
  4. Po co machasz ręcznie QSqlQuery skoro używasz QTableView + QSqlTableModel, które pozwala edytować rekordy?
0
tajny_agent napisał(a):

@Xezolpl: Byłoby nam o wiele prościej gdyby ten kod miał ręce i nogi. Nie obraź się, ale to co wrzuciłeś to jest masakra.

  1. Klasa Adding. Bóg wie co to jest i czym się zajmuje. Nazwa z tzw. czapki.
  2. Nie wiem dlaczego ukochałeś funkcje void. Ciężko się taki kod czyta, bo te funkcje niby nic nie zwracające modyfikują masę zmiennych. I trzeba się wczytywać dokładnie w kod, żeby wyśledzić kto, co, gdzie i jak modyfikuje.
  3. Funkcja database_valid. Tworzy jakiś obiekt, pobiera jakąś nazwę(czego?), dodaje dane do bazy, wyświetla messagebox, zmienia CSS, a nawet pobiera zaznaczone wiersze. Brakuje jeszcze, żeby skoczy skoczyła do sklepu po piwo i zamówiła pizzę :>. No i kolejny raz nazwa... albo isValid albo validate.
  4. Po co machasz ręcznie QSqlQuery skoro używasz QTableView + QSqlTableModel, które pozwala edytować rekordy?

:D dużo tego, ale jestem początkujący "wiem, że nic nie wiem" , to tak, po kolei

1.Adding to dla mnie intuicyjnie taka nazwa klasy bo jest to ui z lineeditami z których potem wartości ściągają voidy tam getName (nazwa) getKcal(kalorie) etc. W tych voidach jest validacja danych czy nie jest np. puste pole itd. i przenoszenie tych danych na zmienne lokalne.

  1. Potem te voidy są wywoływane w jednym voidzie getAll no czyli wszystko (oprócz nazwy bo ta jest sprawdzana w database_valid (validacja danych no racja mogłem dać validate)

3.Potem jak już wszystko będzie działać, wiadomo będę to rozdzielał na mniejsze voidy bo też mi sie nie podoba takie combo ale no co zrobie...

4.Tego to nie wiem, napisałem ten kod zanim zabrałem się za edycje, podczas której tabele zmieniłem z QSqlQueryModel na QSqlTableModel (a właściwie MySqlTableModel z podpięciem query)

0
MasterBLB napisał(a):

MMkey. A gdzie są w kodzie wywoływane te metody Supplies_menu::on_btnedit_clicked() oraz Supplies_menu::on_btnadd_clicked()

No po prostu w jednym przycisku chcę wywołać interfejs z lineeditami i selectingiem ikonki z dysku, potem jej tam przekształceniem na BLOB'a i wstawieniem wszystkiego do bazy danych.
W drugim taki sam interfejs tylko żeby te dane zamiast insertowało to update'owało wybrany rekord. Ten pierwszy już działa itd. drugi no jeszcze nie bo tego sygnału chyba nie ogarniam, czyli co usunąć tego clicked() z edit i napisać osobną funkcję która tam to zconnectuje?

2

Hmmm...z wcześniejszych pytań coś kojarzę, że tu chodzi o jakieś edytowanie rekordu w bazie, a sama aplikacja ma GUI. Jednak szczegóły są zagmatwane, a im więcej tu piszesz tym mniej rozumiemy o co chodzi. Dobra, widzę, że trzeba odnieść się do rzeczy jak Swaróg przykazał, czyli robisz screenszota aplikacji, i domalowujesz na nim w paincie co byś chciał mieć - na razie bez kodu. Jak już w końcu da się zrozumieć, co aktualnie masz, i jaki efekt finalny(słowo klucz) chcesz uzyskać będzie wiadomo, o jakie fragmenty kodu cię Bracie poprosić.

3

Ja bym dodał, że jak chce się z nami dogadać to musi unikać slangu i ponglish-a. Mam wrażenie, że niektóre formułki traktuje jak zaklęcia, których trzeba użyć i pojawiają się taki kwiatki jak: voidy wywoływane już wewnątrz klasy. Efekt jest odwrotny od zamierzonego.

0

BtnAdd mam już to co chcę - dodawanie produktu do bazy danych
BtnEdit tutaj chcę w tym samym interfejsie zrobić co Add tylko zamiast dodawania chcę edycje zaznaczonego przez użytkownika na tabeli rekordu.

#include "supplies_menu.h"
#include "ui_supplies_menu.h"
#include "mainwindow.h"
#include "mysqltablemodel.h"
Supplies_menu::Supplies_menu(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Supplies_menu)
{
    ui->setupUi(this);
    table_display();
}

Supplies_menu::~Supplies_menu()
{
    delete ui;
}

void Supplies_menu::table_display()
{
    ////STWORZENIE TABELI
    add.database_open();
    add.getDatabase(db2);


    QSqlQuery *query2= new QSqlQuery();
    query2->prepare("SELECT * FROM produkty");
    query2->exec();
    MySqlTableModel *model = new MySqlTableModel(this,db2);




    /// STYLIZACJA TABELI I WKLADANIE BAZY DANYCH



    model->wywSetQuery(*query2);
    ui->tableView->setModel(model);
    ui->tableView->hideColumn(0);
    ui->tableView->hideColumn(3);
    ui->tableView->resizeColumnsToContents();
    ui->tableView->setColumnWidth(1,35);
    ui->tableView->setColumnWidth(2,222);
    ui->tableView->setColumnWidth(8,110);
    ui->tableView->setColumnWidth(9,75);
    ui->tableView->resizeRowsToContents();
    add.database_close();


}
void Supplies_menu::on_btnadd_clicked()
{

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

void Supplies_menu::on_btnopen_clicked()
{

}

void Supplies_menu::on_btnedit_clicked()
{

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

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

void Supplies_menu::on_btndel_clicked()
{

}
int Supplies_menu::getSelectedRow(int y)
{
    y = selectedRow;
    return y;
}

#include "adding.h"
#include "ui_adding.h"
#include "supplies_menu.h"

Adding::Adding(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Adding)
{
    ui->setupUi(this);
}

Adding::~Adding()
{
    delete ui;
}

///BUTTONS
void Adding::on_btnok_clicked()
{
    database_open();
    database_valid();
}
void Adding::on_btncancel_clicked()
{
    accept();
}
void Adding::on_btnicon_clicked() //////WYBIERANIE IKONKI
{
    QFileDialog dialog(this);
    dialog.setNameFilter(tr("Images(*.png *.jpg *.xpm  *.bmp)"));
    dialog.setViewMode(QFileDialog::Detail);
    QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),"",
                                                    tr("Image files(*.png *.jpg *.xpm  *.bmp)"));
    if (!filename.isEmpty())
    {
        QImage imege(filename);
        img = imege.scaled(64,64,Qt::IgnoreAspectRatio,Qt::SmoothTransformation);
        ui->icon->setPixmap(QPixmap::fromImage(img));
    }


}
void Adding::on_btnsearsch_triggered(QAction *arg1)
{
    ///WYBÓR ISTNIEJACEGO PRODUKTU Z BAZY DANYCH
    ;
    //ui->btnsearsch->setMenu()
}
///
///MOJE FUNKCJE
///
void Adding::database_open()
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setUserName("root");
    db.setPassword("");
    db.setDatabaseName("supplymng");
    db.open();
    query = QSqlQuery(db);
}
void Adding::database_close()
{
    db.close();
}
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");
    }
}
void Adding::getName()
{
    nm = ui->lnname->text();
    ui->lnname->clear();

}
void Adding::getNotes()
{
    nt = ui->lnnotes->text();
    ui->lnnotes->clear();
}
void Adding::getKcal()
{
    QString Kc = ui->lnkcal->text();
    int Kc1 = Kc.toInt();
    ui->lnkcal->clear();
    if (Kc1>0  && Kc1<900)
    {
        kc=Kc1;
    }
    else
    {
        kc=0;
    }
}
void Adding::getCarbonates()
{
    QString Car = ui->lncarbonates->text();
    int Car1 = Car.toInt();
    ui->lncarbonates->clear();
    if (Car1>0)
    {
        car=Car1;
    }
    else
    {
        car=0;
    }
}
void Adding::getProteins()
{
    QString Pro = ui->lnproteins->text();
    int Pro1 = Pro.toInt();
    ui->lnproteins->clear();
    if (Pro1>0)
    {
        pro=Pro1;
    }
    else
    {
        pro=0;
    }
}
void Adding::getFats()
{
    QString Fa = ui->lnfats->text();
    int Fa1 = Fa.toInt();
    ui->lnfats->clear();
    if (Fa1>0)
    {
        fa=Fa1;
    }
    else
    {
        fa=0;
    }
}
void Adding::getWeight()
{
    QString Wei = ui->lnweight->text();
    int Wei1 = Wei.toInt();
    ui->lnweight->clear();
    if (Wei1>0)
    {
        wei=Wei1;

    }
    else
    {
        wei=0;
    }
}
void Adding::getDate()
{
    dat = ui->caldate->selectedDate();

}
void Adding::getIcon()
{
    ui->icon->clear();
    QByteArray Icon;
    QBuffer buff(&Icon);
    buff.open(QIODevice::WriteOnly);
    img.save(&buff,"PNG");
    if ((Icon.isEmpty()) || (Icon.isNull()))
        icon.clear();
    else icon=Icon;
}
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);
}
void Adding::getAll()
{
    getNotes();
    getKcal();
    getCarbonates();
    getProteins();
    getFats();
    getWeight();
    getDate();
    getIcon();
}
QSqlDatabase Adding::getDatabase(QSqlDatabase datab)
{
    return datab;
}


1

W Qt, mając edytowalny(a o ile nie namieszałeś to masz) QcośtamTableModel podpięty do QTableView edycję pola robi się wywołując QTableView::edit(QModelIndex który ma edytować). Wobec tego, w tym kodzie co masz wystarczy zrobić:

void Supplies_menu::on_btnedit_clicked()
{
    QModelIndex index = ui->tableView->selectionModel()->selectedIndexes().first();
    ui->tableView->edit(index);
}

To odpali na komórce domyślny edytor (kontrolkę GUI) którym jest QLineEdit, i pozwoli ci Bracie wpisać wartość.Są jednak pewne haczyki:

  • dla QTableView musisz nastawić Selection Strategy (czy jak to się zwie, sprawdź w dokumentacji) SelectItems albo SelectIndexes oraz SelectSingleItems - tak żeby pozwalało zaznaczyć tylko jedną komórkę w tabeli.
  • trzeba albo dla modelu, albo dla widoku nastawić EditStrategy odpowiednio aby po zmianie wartości w tabeli przy pomocy edytora tworzonego przez edit() zmiana została zapisana do bazy.
0
void Supplies_menu::on_btnedit_clicked()
{

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

    if (x.isValid())
    ui->tableView->edit(x);
    else QMessageBox::critical(this,"error","error");
  //  add.setModal(true);
  //  add.exec();
}

i wywala takie cudo (załącznik) w debuggerze/

1

Dobrze, że pokazałeś aktualny kod. Wygląda na to, że ui->tableView()->selectionModel(), albo selectedIndexes() daje nullptr. Weź to obadaj pod tym kątem.
UWAGA - ma być tym razem selectedIndexes() nie selectedRows()

0
MasterBLB napisał(a):

Dobrze, że pokazałeś aktualny kod. Wygląda na to, że ui->tableView()->selectionModel(), albo selectedIndexes() daje nullptr. Weź to obadaj pod tym kątem.
UWAGA - ma być tym razem selectedIndexes() nie selectedRows()

Kurcze no działa niby i mogę sobie z tym dodawaniem nawet obrazka poradzić ale nie odpowiada mi to, miało być inne w zamyśle, nie da się tego zrobić przez właśnie ui od klasy adding. Czyli miałbym tak samo jak dodawanie do bazy tylko muszę jakoś odróżnić czy w tamtej klasie ktoś kliknął btnedit czy btnadd. Jak to mogę zrobić? Jakiś connect, zmienna i jej przekazanie?

1

Ale jaki by miał być tego cel? Skoro kod robi to czego potrzebowałeś, to jest edytuje daną w tabeli, a zmiana ta propaguje się do bazy danych, to po co chcesz kombinować??

0
MasterBLB napisał(a):

Ale jaki by miał być tego cel? Skoro kod robi to czego potrzebowałeś, to jest edytuje daną w tabeli, a zmiana ta propaguje się do bazy danych, to po co chcesz kombinować??

No nie będzie tak i tyle:
1.Dodawanie ikonki tam będzie prostsze,
2.Użytkownik nie wprowadzi przypadkowych zmian,
3.Będzie miał na miniaturke i wszystkie dane podgląd i QDialog czy na pewno chce zupdatować dane,
4.Taki był początkowy zamysł, jest imo bardziej intuicyjny, schludniejszy i bezpieczniejszy

Wiem że to wszystko co wyżej wypisałem można zrobić i tak przy takim rozwiązaniu ale nie chce. Pomożesz?

1
Xezolpl napisał(a):

Kurcze no działa niby i mogę sobie z tym dodawaniem nawet obrazka poradzić ale nie odpowiada mi to, miało być inne w zamyśle, nie da się tego zrobić przez właśnie ui od klasy adding. Czyli miałbym tak samo jak dodawanie do bazy tylko muszę jakoś odróżnić czy w tamtej klasie ktoś kliknął btnedit czy btnadd. Jak to mogę zrobić? Jakiś connect, zmienna i jej przekazanie?

W klasie Adding robisz konstruktor:
Adding::Adding(const QSqlRecord& record, QWidget* parent = nullptr);

W funkcji obsługującej kliknięcie przycisku edycji podajesz zaznaczony rekord, a w funkcji obsługującej kliknięcie przycisku tworzenia podajesz QSqlRecord().

W konstruktorze Adding sprawdzasz:

  • jeśli record.isEmpty() zwróci true to znaczy, że będziesz tworzł nowy rekord, jeśli false to znaczy, że będziesz edytował istniejący.
1

Hmmm, nie widać w tym co wkleiłeś w jaki sposób Adding i Supplies_menu są powiązane ze sobą w kwestii widoczności; aby przesłać coś z jednej do drugiej najprościej będzie chyba przy pomocy connect(przycisk, SIGNAL(clicked), obiektKtóryMaZostaćPoinformowany, SLOT(storeWhichButtonWasPressedLast)), ale to w jakimś miejscu programu trzeba mieć dostęp do obiektu i jednej i drugiej klasy - a w zamieszczonym przez ciebie Bracie kodzie takiego miejsca nie widzę. No ale, gdzieś może jest.

To tak, w klasie co to ma odebrać jaki przycisk wciśnięto w tej drugiej klasie (to jest Supplies_menu? Przyjmę, że tak) definiujesz prywatny slot:

void Supplies_menu::storeWhichButtonWasPressedLast()
{
    QObject *o = sender();
    if (o)
    {
       rememberedButtonName = o->name();
    }
}

Ponadto w tym SuppliesMenu zdefiniuj sobie QStringa do przechowywania nazwy przycisku, a w Designerze od ui nazwij oba przyciski różnymi mianami. I potem w kodzie sprawdzasz to rememberedButtonName gdziekolwiek potrzebujesz wiedzieć. Nie zapomnij, że póki żaden z przycisków add/edit nie zostanie wciśnięty ten rememberedButtonName będzie pusty.

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