Seite 1 von 1

[gelöst] SIGNAL kommt nicht an SLOT an

Verfasst: 4. Juni 2010 13:16
von feldmaus
Hi Leute,

ich schreibe gerade ein Programm in QT4 bei dem ich bei der Verbindung von SIGNAL --> SLOT nicht weiterkomme. Ich bin Anfänger. Mit dem QT-Designer habe ich mir ein GUI erstellt die ich in eine Header-Datei umwandle und dann einbinde (versteht sich von selbst). Nun habe ich Member-Funktionen connect() in meinen Konstruktor HauptFenster::HauptFenster eingefügt. Beim kompilieren kommen keine Fehler und beim Ausführen des Programms auch nicht. Allerdings funktioniert keine meiner Menüs.

Hier meine Header und Sourcen:
hauptfenster.h

Code: Alles auswählen

#ifndef HAUPTFENSTER_H
#define HAUPTFENSTER_H

#include <QMainWindow>
#include "ui_hauptfenster.h"

class HauptFenster : public QMainWindow, public Ui::HauptFenster
{
 Q_OBJECT


 public:
  HauptFenster(QWidget *parent = 0);
};

#endif //HAUPTFENSTER_H
ui_hauptfenster.h
http://pastebin.com/y82apMiy

hauptfenster.cpp

Code: Alles auswählen

#include <QtGui>
#include "hauptfenster.h"

HauptFenster::HauptFenster(QWidget *parent):QMainWindow(parent)
{
  setupUi(this);
  connect(closeProgram, SIGNAL(triggered()), this, SLOT(close()));
  connect(closeDatenbankEditor, SIGNAL(triggered()), datenbankEditor, SLOT(close()));
  connect(closeLandkartenEditor, SIGNAL(triggered()), landkartenEditor, SLOT(close()));
}
main.cpp

Code: Alles auswählen

#include <QApplication>
#include <QMainWindow>
#include "hauptfenster.h"

using namespace std;

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
 
  HauptFenster ui;
  QMainWindow *hauptfenster = new QMainWindow;
  ui.setupUi(hauptfenster);
  hauptfenster->show();
 
  return app.exec();
}
Weiß Jemand was ich falsch mache?

Grüße Markus

Re: SIGNAL kommt nicht an SLOT an

Verfasst: 4. Juni 2010 13:22
von franzf
feldmaus hat geschrieben:Weiß Jemand was ich falsch mache?
Doku nicht verstehen :P
Du machst 2x ein setupUi; Im Konstruktor (da gehört es hin!), und nochmal in der main(). Das in der main() entfernt dann die Elemente, die im Konstruktor von HauptFenster angelegt wurden, aus dem Fenster und fügt neue ein, denen dann natürlich die connections fehlen.
Lösung: Einfach das setupUi (natürlich samt ui-Objekt) aus der main entfernen.

Code: Alles auswählen

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
 
  HauptFenster hauptfenster;
  hauptfenster.show();
 
  return app.exec();
}
// edit:
Es ist ja noch schlimmer ;)
Du sollst nicht ein QMainWindow-Objekt erstellen und das HauptFenster als ui-upSetter verwenden. HauptFenster IST SCHON ein QMainWindow, und soll auch gleich als solches verwendet werden, wenn du den multiple inheritance approach wählst.

Verfasst: 4. Juni 2010 13:45
von feldmaus
Vielen Dank franzf,

das wars. Wo steht in der Doku was zu setupUI? Unter All Functions, steht es nicht. Bzw. unter QMainWindow, QWidget und QObject finde ich es nicht.

Grüße Markus

Verfasst: 4. Juni 2010 13:49
von franzf
http://doc.qt.nokia.com/4.6/designer-us ... -file.html
setupUi ist eine Funktion, die dir der uic erstellt. Das passiert erst beim Kompilieren. In der Doku (assistant) steht schon was von setupUi:
void QWidget::setupUi ( QWidget * widget )
Sets up the user interface for the specified widget.

Note: This function is available with widgets that derive from user interface descriptions created using uic.

Verfasst: 4. Juni 2010 13:55
von feldmaus
Alles klar, jetzt habe ich es verstanden, zu 80% :-)

Ich hätte da noch eine Frage ... wie Columbus zu sagen pflegte. :-)
Was soll diese Zeile:

Code: Alles auswählen

HauptFenster::HauptFenster(QWidget *parent):QMainWindow(parent) 
Ist das eine Vererbung des Konstruktors von QMainWindow an meinen Konstruktor?

Grüße Markus

Verfasst: 4. Juni 2010 14:04
von franzf
feldmaus hat geschrieben:Was soll diese Zeile:

Code: Alles auswählen

HauptFenster::HauptFenster(QWidget *parent):QMainWindow(parent) 
Ist das eine Vererbung des Konstruktors von QMainWindow an meinen Konstruktor?
Keine Vererbung des Konstruktors, das nennt sich Basisinitialisierung (also das ": QMainWindow(parent)") und gehört zu den C++-Grundlagen.