QT - klasa obiekt + gui

0

Witam!

Planuję napisać aplikacje, która na podstawie wybranych ustawień będzie tworzyła przebiegi drgań (i inne) wybranych materiałów.

Plan:

  1. Stworzenie klasy bazowej materiału
  2. Stworzenie klas danych materiałów dziedziczących po pkt 1
  3. Stworzenie klasy symulującej/zarządzającej materiałami
  4. GUI

Problem mam z połączeniem pól wejściowych z klasą.

Metoda 1.
Stworzenie dla każdego pola wejściowego(QSpinBox, QLineEdit itp) slotu oraz obsłużenie klasy zarządzającej.
Brzmi to trochę jak dużo niepotrzebnego kodu

void MainWindow::on_spinBox_valueChanged(int arg1)
{
    manager->setFrictionGain(arg1);
}

Metoda 2
Stworzenie danej metody jako slotu i bezpośrednie połączenie:

  connect(ui->spinBox, SIGNAL(valueChanged(int)), manager, SLOT(setFrictionGain(int)));

Niestety, argumenty funkcji muszą się zgadzać, jeżeli setFrictionGain będzie miał argument typu float, to i nawet z QDoubleSpinBox będzie problem bo ma argument typu double (taki przykład).

Więcej metod nie znam

Kolejnym problemem jest synchronizacja danych z GUI do klasy "manager", jeśli wpiszę początkowe wartości w GUI, to żeby klasa je otrzymała muszę pisać:

// metoda 1.
  connect(ui->spinBox, SIGNAL(valueChanged(int)), manager, SLOT(setFrictionGain(int)));
  manager->setFrictionGain(ui->spinBox->value());

Sprawa się komplikuje, jeśli tych pól będzie naprawde dużo (powyżej 50ciu).
Jak to najlepiej zrobić?

W Qt dłubię od niedawna (mam doświadczenie w C/C++ ukiernkowane w tworzeniu bibliotek do przetwarzania danych), szybko się uczę, ale potrzebuję kilka wskazówek jak takie aplikacje budować.
Przejrzałem dziś na szybko QtQuick'a, myślałem że interakcja pomiędzy gui a klasami będzie jakoś bardziej przemyślana, ale niestety nie widzę żadnych zalet.

2

W Qt5 możesz połączyć metodę pierwszą i drugą:

connect(ui->spinBox, &QSpinBox::valueChanged, manager, [this](int gain) { manager->setFrictionGain(gain); });

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.