Problem mit Slots

Alles rund um die Programmierung mit Qt
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Problem mit Slots

Beitrag von code_specialist »

Hallo,
ich beschäftige mich schon seit längerer Zeit mit C++ und habe mich nun entschieden auch in die Qt Programmierung einzusteigen. Anfangs funktionierten alle Tutoriale sehr gut, doch nun weiß ich nicht mehr weiter.
Ich habe einen interessanten Quellcode unter diesem Link gefunden:

http://www.galileocomputing.de/katalog/ ... 3-REXB.Jgk

Der Quellcode auf den ich mich beziehen will ist folgender:

Code: Alles auswählen

/*****main.cpp*****/
#include <QApplication>
#include "mywindow.h"

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


/*****mywindow.h*****/
 #ifndef MYWINDOW_H
 #define MYWINDOW_H
 #include <QWidget>
 #include <QVBoxLayout>
 #include <QPushButton>
 #include <QLabel>
 #include <QObject>

 class MyWindow : public QWidget
 {
    Q_OBJECT
    public:
       MyWindow(QWidget *parent = 0);
    private:
       QLabel *label;
       QPushButton *button0;
       QPushButton *button1;
       QVBoxLayout* layout;
    private slots:
       void setText();
 };
 #endif
 /*****mywindow.h*****/


/*****mywindow.cpp*****/
#include "mywindow.h"

 MyWindow::MyWindow(QWidget *parent): QWidget(parent)
 {
    label = new QLabel("alter Text");
    button0 = new QPushButton ("Label aktualisieren");
    button1 = new QPushButton ("Beenden");
    layout = new QVBoxLayout(this);
    layout->addWidget(button0);
    layout->addWidget(button1);
    layout->addWidget(label);
    setLayout(layout);
    connect( button0, SIGNAL( clicked() ),
               this, SLOT( setText() ) );
    connect( button1, SIGNAL( clicked() ),
               this, SLOT( quit() ) );
 }

 void MyWindow::setText()
 {
      label->setText("neuer Text");
 }
  /*****mywindow.cpp*****/

Ich habe natürlich vorher die Datei mywindow.moc erzeugt. Beim kompilieren hatte ich nur eine Fehlermeldung:

QObject: No such file or directory

Ich habe also erstmal das #include QObject rausgelassen. Beim nächsten Kompilierversuch bekam ich unzählige undefined reference to... Fehlermedungen. Ich ersetzte in der main.cpp das #include "mywindow.h" durch ein #include "mywindow.moc". Danach lies sich der Code Problemlos kompilieren. Wenn ich das Programm aber nun starte habe ich im Konsolenfenster hinter dem Qt Fenster folgende Fehlermeldung:

QObject::connect: No such slot MyWindow::quiet()

Wie man aus der Fehlermeldung schließen kann funktioniert der "Beenden" Button nicht.

Weiß jemand woher das Problem kommt und wie ich es lösen kann???
Ich freu mich über jede Hilfe.
Schonmal danke im vorraus...
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Womit kompilierst du denn? Benutzt du auch brav die .pro Datei und qmake?

Qmake erstellt dir aus deiner .pro Datei eine schicke Makefile, welche du dann zum kompilieren benutzen solltest.
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Beitrag von code_specialist »

Achso, ganz vergessen das mit zu schreiben. Ich benutze als IDE Code::Blocks. Kompilieren tue ich wie folgt:

qmake -project
qmake
make

Danach drücke ich nochmal in Code::Blocks auf kompilieren und fertig ist die .exe Datei.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

"make" kompiliert doch bereits, warum noch in Codeblocks? Klingt für mich als kompilierst du ein zweites mal mit CodeBlocks, und diesmal falsch.
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Beitrag von code_specialist »

Ich muss zugeben, dass ich mich bisher noch nicht mit den genaueren Aufgaben von "make" etc. beschäftigt habe. Ich hab es aber gerade eben noch mal getestet und mir ist eine Fehlermeldung aufgefallen, die mir bisher entgangen ist. Wenn ich "make" eingebe kommt ziemlich weit unten folgender Hinweis:

...

C.\...\mingw32\bin\ld.exe:
cannot find -lqtmaind

Da hört bei mir vollkommen das Vokabular auf...
Ich hab die .exe überprüft und make hat sie nicht neu erstellt.
Weiß jemand woher der Fehler kommt und wie ich ihn beseitigen kann?
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Beitrag von code_specialist »

Ok, ich hab einen Teil der Fehler gefunden. Die Lösung zu dem Problem, dass "make" -lqtmaind nicht finden konnte, gibt es hier:

http://www.qtforum.de/forum/viewtopic.p ... dfc1a0880f

Einfach im Makefile.Debug die angegebenen Namen ändern.
Jetzt gibt "make" allerdings eine neue Fehlermeldung aus:

C:\...\moc_mywindow.cpp:(.data+0x0): multiple definition of "MyWindow::staticMetaObject"
debug/main.o:C/.../main.cpp:(.data+0x0): first defined here

Ich hoffe ihr könnt mir nochmal weiterhelfen...
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Nicht ohne Kristallkugel oder den Sourcecode.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

moc_mywindow.cpp wird in main.cpp inkludiert würde ich sagen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
M.L.
Beiträge: 9
Registriert: 22. Februar 2008 10:29

Re: Problem mit Slots

Beitrag von M.L. »

Auch hallo,
Ich habe einen interessanten Quellcode unter diesem Link gefunden:

http://www.galileocomputing.de/katalog/ ... 3-REXB.Jgk
Der Code liegt auf der Buch CD im Ordner Listings\signalslot5
Mit der OpenSource Edition 4.3.2 und der speziellen Eingabeaufforderung für Qt lässt er sich jedenfalls 'mit dem Dreisatz' erfolgreich kompilieren:
Dateianhänge
slot5.png
slot5.png (134.49 KiB) 7867 mal betrachtet
Zuletzt geändert von M.L. am 28. Mai 2008 23:02, insgesamt 2-mal geändert.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Bitte pass doch die Größe der Bilder an, die du hochlädst...
M.L.
Beiträge: 9
Registriert: 22. Februar 2008 10:29

Beitrag von M.L. »

Besser so ?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wer soetwas hochlädt, will einfach keine Hilfe...
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Beitrag von code_specialist »

Entschuldigt dass ich so lange nicht geantwortet habe.
Hier der Quellcode von moc_mywindow.cpp:


[code]
/****************************************************************************
** Meta object code from reading C++ file 'mywindow.h'
**
** Created: Wed 28. May 18:23:53 2008
** by: The Qt Meta Object Compiler version 59 (Qt 4.3.4)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#include "../mywindow.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'mywindow.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 59
#error "This file was generated using the moc from 4.3.4. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

static const uint qt_meta_data_MyWindow[] = {

// content:
1, // revision
0, // classname
0, 0, // classinfo
1, 10, // methods
0, 0, // properties
0, 0, // enums/sets

// slots: signature, parameters, type, tag, flags
10, 9, 9, 9, 0x08,

0 // eod
};

static const char qt_meta_stringdata_MyWindow[] = {
"MyWindow\0\0setText()\0"
};

const QMetaObject MyWindow::staticMetaObject = {
{ &QWidget::staticMetaObject, qt_meta_stringdata_MyWindow,
qt_meta_data_MyWindow, 0 }
};

const QMetaObject *MyWindow::metaObject() const
{
return &staticMetaObject;
}

void *MyWindow::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_MyWindow))
return static_cast<void*>(const_cast< MyWindow*>(this));
return QWidget::qt_metacast(_clname);
}

int MyWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QWidget::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: setText(); break;
}
_id -= 1;
}
return _id;
}
[/code]

Wozu ist dieser Quellcode da? Ich kann daraus leider nur sehr wenig lesen. Ich würde mich über weitere Antworten freuen,
mfg code_specialist
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Der wird automatisch generiert und ist unrelevant. Du darfst diesen Code nicht irgendwo inkludieren. Einfach nur den Header in deiner .Pro Datei eintragen, qmake ausführen und mit der generierten Makefile kompilieren. Steht auch alles in der Qt Dokumentation.
code_specialist
Beiträge: 10
Registriert: 26. Mai 2008 16:19

Beitrag von code_specialist »

Hallo nochmal,
ich include moc_mywindow.cpp NICHT. Der Quellcode den ich versuche zu kompilieren ist der selbe wie in meinem ersten post. Die einzigen Änderungen, die ich vorgenommen habe, sind, dass ich

#include <QObject>

in der Datei mywindow.h rauslasse, weil mein Kompiler da eine Fehlermeldung ausgibt. Ausserdem include ich in der Datei main.cpp anstatt

#include<mywindow.h>

die Datei

#include<mywindow.moc>

, da ich so unzählige undefined reference Fehlermeldungen verhindere.
(siehe oben, da steht das selbe)
Antworten