einfacher taschenrechner = proplem

Alles rund um die Programmierung mit Qt
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

aber der von Dir oben genannte fehler bezieht sich doch genau da drauf ?!
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Ich würde für ein layout das du hinzufügen möchtest nicht

Code: Alles auswählen

addWidget()
sonder

Code: Alles auswählen

addLayout()
verwenden!
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

@jerry: sorry hatte es verplant du hast schon recht! genau das ist der fehler. aber addLayout() funktioniert auch nicht. wie bekomm ich die zwei seiten in das stackedWidget?
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Dann noch eins! :D

QWidget erstellen, darauf das Layout anwenden und das widget mit addWidget() hinzufügen!
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

leider klappt das so auch nicht! bist du dir sicher das es addLayout() überhaupt gibt? der compiler behandelt das nämlich immer als member mit der folgenden fehlermeldung:

Code: Alles auswählen

error: "class QWidget" has no member named "addLayout"
wie bekomm ich das grid in das stackedwidget?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

also jedes QWidget hat die Methode setLayout(QLayout*)
Die Doku ist da Gold wert :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Prinzipiell:
du solltest die Qt Klassen in deinem Header includen (nicht in der cpp-Datei), denn wenn du dein QLineEdit im Header deklarierst, benötigst du sie da bereits.
NEIN !!! nicht in dem Fall.
Er braucht nicht die Definition der Klassen, er braucht nur den Typnamen ...

Code: Alles auswählen

#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

#include <QWIDGET>

class QLineEdit;
class QStackedWidget;

class rechner : public QWidget{
   Q_OBJECT

   public:
    rechner(QWidget *parent = 0);

    private slots:
    void addieren();
    void subtrahieren();
    void showaddieren();
    void showsubtrahieren();
    void klosen();
     
    private:   
    QLineEdit *inputa;
    QLineEdit *inputb;
    QLineEdit *inputc;
    QLineEdit *inputa2;
    QLineEdit *inputb2;
    QLineEdit *inputc2;
    QStackedWidget *stacked;
   
};

#endif
Ist viel robuster, weil weniger Abhaengigkeiten.

die Includes sollten dann natuerlich in die cpp wieder wandern.

Die Definition eines Typs brauchst du nur fuer:
- konkrete Membervariable (also keine zeiger auf)
- Ableitungen ...
(also generell wann man den eine Instanz des Types im Speicherbereich der eigenen Instanz miterzeugt)
- wenn du funktionen des Typs im Header aufrufst (Header Implementierungen)

ansonsten langt nen forward.

Das sollt man sich schon recht zeitig angewoehnen ....

Ciao ....
wayneos
Beiträge: 38
Registriert: 28. Oktober 2008 14:09

Beitrag von wayneos »

danke danke, ist echt ne super plattform hier :D

leider bräuchte ich nochmals hilfe bei einer kleinigkeit. will nun noch eine QMenuBar integrieren, jedoch zeigt er sie nicht an (keinen fehler beim compiler)

hier mal der aussschnitt der rechner.cpp:

Code: Alles auswählen

	quid = new QAction(parent);
	quid -> setText ("quit");
	connect(quid, SIGNAL(triggered()), this, SLOT(klosen()));
	addi = new QAction(parent);
	addi -> setText ("quit");
	connect(addi, SIGNAL(triggered()), this, SLOT(showaddieren()));
	subt = new QAction(parent);
	subt -> setText ("quit");
	connect(subt, SIGNAL(triggered()), this, SLOT(showsubtrahieren()));
	
	QMenu *menudatei = new QMenu;
	menudatei -> addAction (quid);
	QMenu *menuchoose = new QMenu;
	menuchoose -> addAction (addi);
   menuchoose -> addAction (subt);
    
    QMenuBar *menubar = new QMenuBar;
    menubar -> addMenu (menudatei);
    menubar -> addMenu (menuchoose);
kann ich überhaupt eine menubar zu einen widget als fenster dazufügen?
chrootdev
Beiträge: 70
Registriert: 18. April 2008 17:52

Beitrag von chrootdev »

Das Problem ist, das du zwar eine QMenuBar zusammengebaut hast, aber gesetzt hast du sie am fenster noch nicht!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Mit dem gezeigten code hasst zwar ne Menubar mit menustruktur definiert, die aber weder layouttechnisch, noch QT hirarchietechnisch, an dein fenster(widget) gekoppelt ist ... das ding schwebt irgendwo, wird also nie angezeigt werden.

QT Oberflaechenelemente (Qwidgets und deren ableitungen) solltest immer mit zeiger auf das parent gleich erzeugen ... damit haengt es in der QT Parent/client hirarchie und wird automatisch zerstoert, wenn dein Parent widget zerstoert wird. sonst gibts haessliche ressorcenlecks.

layouttechnisch ist dein einhaengepunkt aber eigentlich die menubar ....

die kann man sich von QMenuBar * menuBar () const von nem QMainwidget holen .... "Normale" widgets haben eigentlich keine Menubars, sondern nur context menues.

Code: Alles auswählen

 
   QMenuBar * myMenu = QMenuBar();

   QMenu *menudatei = new QMenu(myMenu );
   menudatei->setTitle(tr("Datei"));
   QMenu *menuchoose = new QMenu(myMenu);
   menuchoose->setTitle(tr("Auswahl")); 
   quid = new QAction(menudatei );
   quid -> setText ("quit");
   connect(quid, SIGNAL(triggered()), this, SLOT(klosen()));
   addi = new QAction(menuchoose );
   addi -> setText ("quit");
   connect(addi, SIGNAL(triggered()), this, SLOT(showaddieren()));
   subt = new QAction(menuchoose );
   subt -> setText ("quit");
   connect(subt, SIGNAL(triggered()), this, SLOT(showsubtrahieren()));
   
   // und falls es ned langt die layout struktur explizit noch mal einstellen
   // bin mir ned sich ob man das wirklich braucht 
   menudatei -> addAction (quid);
   menuchoose -> addAction (addi);
   menuchoose -> addAction (subt);
   myMenu -> addMenu (menudatei);
   myMenu -> addMenu (menuchoose);
So sollte es funktionieren ... hab sicher noch schreibfehler und so drinn ...
wie gesagt, dein fenster in dem grad bist, sollte aber nen QMainWidget sein ....

Ciao ...
Antworten