Ik ben een klein programma aan het schrijven in C++/QT maar ben een beetje de weg kwijt met het doorgeven van objecten naar andere objecten. Althans, ik wil een referentie doorgeven zodat ik geen global object hoef te gebruiken. Ik ben wel redelijk weg wijs in simpele C code maar dit groeit me even boven me pet, misschien dat hier iemand me wat tips of aanwijzingen kan geven. En misschien zit ik ook wel in een verkeerde oplossing te denken.
Het vereenvoudigde probleem is dit:
Ik heb een Raspberry Pi met daar op aangesloten een I2C thermometer en een I2C pwm boardje.
Ik wil 1 object aan maken met daarin de status van de in en uitgangen, wat configuratie gegevens en de code om de uitgangen te sturen. Omdat de sensoren gepold moeten worden wil ik met een timer om de x (mili) seconden een functie aanroepen in het object om de sensoren uit te lezen en op te slaan in waardes in het object. Ik wil dit object (uiteraard geen kopie!) kunnen gebruiken binnen een ander object, als voorbeeld hier een object van een dialog window, alleen gaat dit uiteraard fout want de SetPWM wordt gedaan in localIOobject en niet in IOmainWindow.
Hoe kan ik dit het beste en netste doen?
In een latere versie wil ik misschien nog wat processen gaan multi-threaden en hoewel dat echt een gevorderde oefening is voor later is het misschien wel handig om daar nu al rekening mee te houden.
Het vereenvoudigde probleem is dit:
Ik heb een Raspberry Pi met daar op aangesloten een I2C thermometer en een I2C pwm boardje.
Ik wil 1 object aan maken met daarin de status van de in en uitgangen, wat configuratie gegevens en de code om de uitgangen te sturen. Omdat de sensoren gepold moeten worden wil ik met een timer om de x (mili) seconden een functie aanroepen in het object om de sensoren uit te lezen en op te slaan in waardes in het object. Ik wil dit object (uiteraard geen kopie!) kunnen gebruiken binnen een ander object, als voorbeeld hier een object van een dialog window, alleen gaat dit uiteraard fout want de SetPWM wordt gedaan in localIOobject en niet in IOmainWindow.
Hoe kan ik dit het beste en netste doen?
In een latere versie wil ik misschien nog wat processen gaan multi-threaden en hoewel dat echt een gevorderde oefening is voor later is het misschien wel handig om daar nu al rekening mee te houden.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| //main.cpp #include <QApplication> #include "mainwindow.h" #include "MyIOClass.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w(); w.show(); return a.exec(); } |
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "MyIOClass.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT MyIOClass IOmainWindow; public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButton_3_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H |
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| //mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "MyIOClass.h" MainWindow::MainWindow(, QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { MyIOClass IOmainWindow; ui->setupUi(this); connect(ui->verticalSlider,SIGNAL(valueChanged(int)), &IOmainWindow,SLOT(SetPWM0(int))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_3_clicked() { ConfigDialog ConfDialog(IOmainWindow); ConfDialog.setModal(true); ConfDialog.exec(); } |
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| //ConfigDialog.h #ifndef CONFIGDIALOG_H #define CONFIGDIALOG_H #include <QDialog> #include "MyIOClass.h" namespace Ui { class ConfigDialog; } class ConfigDialog : public QDialog { Q_OBJECT MyIOClass localIOobject; public: explicit ConfigDialog(MyIOClass IOobject, QWidget *parent = 0); ~ConfigDialog(); private: Ui::ConfigDialog *ui; void ConfigDialog::on_pushButton_2_clicked(); }; #endif // CONFIGDIALOG_H |
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| //ConfigDialog.cpp #include "configdialog.h" #include "ui_configdialog.h" #include "MyIOClass.h" ConfigDialog::ConfigDialog(MyIOClass IOobject, MyQWidget *parent) : QDialog(parent), ui(new Ui::ConfigDialog) { localIOobject = IOobject; ui->setupUi(this); } void ConfigDialog::on_pushButton_2_clicked() { localIOobject.SetPWM(0,4000); } ConfigDialog::~ConfigDialog() { delete ui; } |
All electric components run on smoke. If you let the smoke out, they won't work anymore.