Slot wird nicht ausgeführt

Alles rund um die Programmierung mit Qt
Antworten
Mr.DX
Beiträge: 5
Registriert: 3. September 2006 12:10

Slot wird nicht ausgeführt

Beitrag von Mr.DX »

Hi,
ich bin neu hier und bin noch ein blutiger qt-Anfänger.
Daher wollte ich einfach mal ein kleines Testprogramm schreiben, das mir, wenn ich auf einen Button klicke, eine Meldung ausgiebt. Den Signal/Slot habe ich mit connect verbunden, allerdings passiert nichts. Die Funktion wird nicht aufgerufen und die Meldung nicht ausgegeben.
Was habe ich falsch gemacht?

Hier der Code:

Code: Alles auswählen

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
#include <QMessageBox>

class MyWidget : public QWidget
{
	public:
	    MyWidget(QWidget *parent = 0);
	    
	private slots:
		/* Slot */
		void SlotOpenFile();
};

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    setFixedSize(200, 120);

    QPushButton *quit = new QPushButton(tr("Open file"), this);
    quit->setGeometry(47, 40, 105, 30);
    quit->setFont(QFont("Times", 18, QFont::Bold));

    connect(quit, SIGNAL(clicked()), this, SLOT(SlotOpenFile()));
}

void MyWidget::SlotOpenFile()
{
	MessageBox::information(this, "Application",
		"Test");
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget* widget = new MyWidget();
    widget->show();
    return app.exec();
} 
Zum kompilieren nehme ich Eclipse+CDT+MinGW her.

Vielen Dank im voraus.
Emperor_L0ser
Beiträge: 51
Registriert: 28. Juli 2005 12:26
Kontaktdaten:

Beitrag von Emperor_L0ser »

einen der üblichen anfänger fehler gemacht :D

such mal im forum nach Q_OBJECT, das thema wurde schon des öfteren behandelt

mfg Emperor_L0ser
Mr.DX
Beiträge: 5
Registriert: 3. September 2006 12:10

Beitrag von Mr.DX »

Danke, das hat mich einen Schritt weiter gebracht. Nun kommen allerdings diese Fehlermeldungen:
release\main.o(.text+0x95):main.cpp: undefined reference to `vtable for MyWidget'
release\main.o(.text+0x9c):main.cpp: undefined reference to `vtable for MyWidget'
release\main.o(.text+0xc5):main.cpp: undefined reference to `MyWidget::staticMetaObject'
release\main.o(.text+0xd15):main.cpp: undefined reference to `vtable for MyWidget'
release\main.o(.text+0xd1c):main.cpp: undefined reference to `vtable for MyWidget'
release\main.o(.text+0xd45):main.cpp: undefined reference to `MyWidget::staticMetaObject'
Ich habe gelesen, das das irgendetwas mit dem moc zu tun hat.

Ich kompiliere mein Programm bisher so:
1. qmake -project
2. qmake
3. mingw32-make (das wird dann bei 'Build Project' aufgerufen)

Irgendwie komme ich nicht klar, was ich daran ändern soll. Das, was ich bisher gelesen habe, war irgendwie spartanisch für mich :(
Wärst du so nett und würdest mir erklären, was ich tun muss?
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Beitrag von caligano »

Mr.DX hat geschrieben: Ich habe gelesen, das das irgendetwas mit dem moc zu tun hat.
Richtig, und deswegen führst du einfach noch einmal qmake aus, dann müsste das Programm korrekt kompilieren!

Ich habs dir aber nochmal in einer etwas anderen Form aufgeschrieben, die wirst du später brauchen:


main.cpp

Code: Alles auswählen

#include <QApplication>
#include "test.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}
test.h

Code: Alles auswählen

#ifndef TEST_H
#define TEST_H

#include <QObject>
#include <QDialog>

class QPushButton;
class QMessageBox;

class MyWidget : public QWidget
{
 	   Q_OBJECT
 	  
public:
	   MyWidget(QWidget *parent = 0);
	   
private:
		QPushButton *quit;

private slots:
   		   void slot();
};


#endif
test.cpp

Code: Alles auswählen

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

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    quit = new QPushButton("button",this);
    connect(quit, SIGNAL(clicked()), this, SLOT(slot()));
}

void MyWidget::slot()
{
 	QMessageBox::information(this, "Application","Test");
}
Mr.DX
Beiträge: 5
Registriert: 3. September 2006 12:10

Beitrag von Mr.DX »

Wow, tausend Dank.
Ich habe das Widget nun wie du es gepostet hast in eine extra Datei ausgelagert (nicht mehr in der Main). Und nun tauchen auch die moc-Dateien auf.
Vielen, vielen Dank euch beiden. Nun gehts endlich *freu*
Antworten