Verständnissproblem mit Klassen
-
Hallo Forum,
nachdem ich (auch dank der Hilfe des Forums hier) mittlerweile recht ansehnliche C-Programme auf µCs und Ansteuerung dieser durch den PC via Konsole geschrieben habe versuche ich mich gerade an der GUI-Programmierung mit Qt.
Aktuell habe ich das Problem das ich per Konfigurations-Widget einige Parameter wie die Baudrate setzen möchte. Die eingegebenen Werte sollen dann in zwei unterschiedlichen Stellen (Statusbar und Widget im StackedWidget) angezeigt werden (und die Standardanzeige ersetzen).
Als Minimalbeispiel habe ich den (ziemlich unschönen) Code zusammngebastelt:
mainwindow.h
#include <QMainWindow> #include <QWidget> #include <QLabel> #include <QVBoxLayout> #include <QString> #include <QPushButton> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); public slots: void Update(); void OpenW(); }; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); private slots: void Press(); };
mainwindow.cpp
#include "mainwindow.h" QString string = "ABC"; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *widget = new QWidget(); QVBoxLayout *box = new QVBoxLayout; QLabel *label = new QLabel(string); box->addWidget(label); widget->setLayout(box); setCentralWidget(widget); OpenW(); } void MainWindow::OpenW() { Widget *widget = new Widget(); widget->show(); } void MainWindow::Update() { this->update(); } Widget::Widget(QWidget *parent) : QWidget(parent) { QVBoxLayout *boxw = new QVBoxLayout; QPushButton *btn = new QPushButton("DEF"); boxw->addWidget(btn); setLayout(boxw); connect(btn, SIGNAL(clicked()), this, SLOT(Press())); } void Widget::Press() { string = "DEF"; MainWindow::Update(); /* was muss hier anders gemacht werden?? */ }
Ich hoffe mir kann jemand helfen. Das Problem beschäftigt mich nun seit knapp 2 Wochen.
VD Nod88
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Äh da ist so einiges unstimmig, aber vielleicht testest du ja nur rum..
Jedenfalls kannst du "new Widget(this);" schreiben, dann hast du das MainWindow-Objekt in Widget per parent() zur Verfügung:
connect(btn, SIGNAL(clicked()), parent(), SLOT(Update()));
Oder mach das connect() einfach inOpenW().
-
Hallo Hi,
vielen Dank für die Hilfe, ich musste noch etwas überarbeiten, aber jetzt funktioniert es so wie ich will. Für alle mit ähnlichem Problem, hier ist nun meine Lösung (und wie Hi schon geschrieben hat, das ist nur ein Minimalbeispiel zum testen und der Code ist nicht unbedingt allzu stimmit);
mainwindow.h
#include <QMainWindow> #include <QWidget> #include <QLabel> #include <QVBoxLayout> #include <QString> #include <QPushButton> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); QLabel *label; public slots: void Update(); void OpenW(); }; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0);; };
mainwindow.cpp
#include "mainwindow.h" QString string = "ABC"; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget *widget = new QWidget(); QVBoxLayout *box = new QVBoxLayout; label = new QLabel(string); box->addWidget(label); widget->setLayout(box); setCentralWidget(widget); OpenW(); } void MainWindow::OpenW() { Widget *widget = new Widget(this); widget->setWindowFlags( Qt::Window); widget->show(); } void MainWindow::Update() { string = "DEF"; label->setText(string); } Widget::Widget(QWidget *parent) : QWidget(parent) { QVBoxLayout *boxw = new QVBoxLayout; QPushButton *btn = new QPushButton("DEF"); boxw->addWidget(btn); setLayout(boxw); connect(btn, SIGNAL(clicked()), parent, SLOT(Update())); }
Vielen Dank
Nod88