[gelöst] Signals/Slots lassen sich nicht kompilieren

Alles rund um die Programmierung mit Qt
Antworten
gosar
Beiträge: 8
Registriert: 4. August 2005 15:30

[gelöst] Signals/Slots lassen sich nicht kompilieren

Beitrag von gosar »

Hallo!
Ich mache gerade meine ersten Gehversuche in Qt und habe über den Designer ein einfaches Mainwindow (Name: HauptFenster) mit einem QPushButton (Name: pushButton) und einem QLineEdit-Feld (Name: lineEdit) gebastelt. Beim Drücken des Buttons soll der Text "Test!" in das Edit-Feld geschrieben werden.

Meine main.cpp sieht folgendermassen aus:

Code: Alles auswählen

#include "ui_meineui.h"
#include <QApplication>
#include <QObject>
#include <QMessageBox>


class QMeinHauptFenster : public QMainWindow, private Ui::HauptFenster
{
 // Q_OBJECT

  public:
                QMeinHauptFenster(QWidget *parent = 0);

  public slots:
                void textSetzen();
};


QMeinHauptFenster::QMeinHauptFenster(QWidget *parent) : QMainWindow(parent)
    {
        setupUi(this);
        QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(textSetzen()));
    };

void QMeinHauptFenster::textSetzen()
    {
        lineEdit->setText("Test!");
    }


int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QMeinHauptFenster *window = new QMeinHauptFenster;
  
  window->show();
  
  return app.exec();
}

Programm lässt sich kompilieren und ausführen, nur beim Drücken des Buttons passiert nichts.
Anscheinend wird der Slot (clicked) nicht erkannt. Ich hatte den vorher auch schon als public deklariert, brachte aber auch nichts.

Was mache ich falsch?
Wäre nett, wenn mich diesbezüglich jemand aufklären könnte.

Danke.

Gosar
Zuletzt geändert von gosar am 4. August 2005 23:36, insgesamt 1-mal geändert.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Welchen Compiler benutzt du?
pushButton gibts zu der Zeit schon, wo du deinen connect machst?
Du hast schon versucht den pushButton explizit nach (QPushButton*) zu casten?

Goos
gosar
Beiträge: 8
Registriert: 4. August 2005 15:30

Beitrag von gosar »

Ich benutze auf dem Windows-System den Mingw-Compiler, auf meinem Linux-System den gcc.

Der Connect befindet sich im Constructor der Klasse, nach dem "setupUi(this);", also gehe ich davon aus, dass der pushButton schon existiert.

Das Casten hat leider nichts gebracht, gesetz dem Fall ich habe das richtig gemacht:

Code: Alles auswählen

QMeinHauptFenster::QMeinHauptFenster(QWidget *parent) : QMainWindow(parent)
    {
        setupUi(this);
        QObject::connect((QPushButton*)pushButton, SIGNAL(clicked()), this, SLOT(textSetzen()));
    };
Mal angenommen, ich setze den Connect in die Main-methode über "window->show();" so gibt er an der pushButton wäre nicht deklariert. Wie muss ich den denn referenzieren? window->pushButton?
gosar
Beiträge: 8
Registriert: 4. August 2005 15:30

Beitrag von gosar »

Noch ein Nachtrag:

Ich habs jetzt mal unter Linux kompiliert. Beim starten der Executable gibts in der Bash folgende Hinweise:

Object::connect: No such slot QMainWindow::textSetzen()
Object::connect: (sender name: 'pushButton')
Object::connect: (receiver name: 'HauptFenster')


Kann ich mir aber nicht wirklich erklären.
Ihr vielleicht ?
Danke.
Gosar
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ja, du hast Q_OBJECT auskommentiert - da kann es nicht gehen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gosar
Beiträge: 8
Registriert: 4. August 2005 15:30

Beitrag von gosar »

Wenn ich Q_OBJECT wieder einsetze kommen beim compilieren folgende Meldungen:

Code: Alles auswählen

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.0.0/mkspecs/default -I. -I/usr/local/Trolltech/Qt-4.0.0/include/QtGui -I/usr/local/Trolltech/Qt-4.0.0/include/QtCore -I/usr/local/Trolltech/Qt-4.0.0/include -I. -I. -I. -o main.o main.cpp
g++ -Wl,-rpath,/usr/local/Trolltech/Qt-4.0.0/lib -o mi main.o   -L/usr/local/Trolltech/Qt-4.0.0/lib -L/root/downloads/qt4/qt-x11-opensource-desktop-4.0.0/lib -lQtGui_debug -L/usr/X11R6/lib -lpng -lSM -lICE -lXi -lXrender -lXrandr -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lm -lQtCore_debug -lz -ldl -lpthread
main.o(.text+0x146): In function `QMeinHauptFenster::QMeinHauptFenster(QWidget*)':
/root/programmieren/qt/mi/ui_meineui.h:25: undefined reference to `vtable for QMeinHauptFenster'
main.o(.text+0x152):/root/programmieren/qt/mi/ui_meineui.h:25: undefined reference to `vtable for QMeinHauptFenster'
main.o(.text+0x208): In function `QMeinHauptFenster::QMeinHauptFenster(QWidget*)':
/root/programmieren/qt/mi/ui_meineui.h:27: undefined reference to `vtable for QMeinHauptFenster'
main.o(.text+0x214):/root/programmieren/qt/mi/ui_meineui.h:27: undefined reference to `vtable for QMeinHauptFenster'
collect2: ld returned 1 exit status
make: *** [mi] Error 1
Wie kann ich das denn verhindern?
Also muss Q_OBJECT zwangsläufig gesetzt sein?
gosar
Beiträge: 8
Registriert: 4. August 2005 15:30

Lösung!

Beitrag von gosar »

Jetzt habe ich das Problem klären können.

a) War wie schon beschrieben wurde das Kommando Q_OBJECT nicht gesetzt
b) ...ging dies aber leider nicht, da es immer zu einem Fehler "undefined reference to .." beim compilieren kam
Das hat (vorsicht Halbwissen) folgende Ursache: Der moc durchsucht beim kompilieren nur die .h-Dateien. Da ich aber alles in der main.cpp-Datei programmiert hatte konnte er Q_OBJECT nicht finden.

Nun habe ich die Klassendefinition in QMeinHauptFenster.h und den Konstruktor und den Slot in die QMeinHauptFenster.cpp-Datei ausgelagert und somit in der main.cpp ausschliesslich die main-Routine gelassen.

Jetzt kompiliert er sauber durch und das Programm verhält sich auch so wie es gewünscht war.
Danke nochmals für die Hilfe und die Anregungen!

Gruß,
Gosar
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Richtig :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten