Eigenes Slots in QT
-
Hi,
ich möchte einen int-Wert von einem QWidget-Fenster zum anderen übertragen via Slot (musikrichtungGeklickt).Dazu setze ich den QSignalMapper ein.
Leider bekomme ich den Fehler:
C:\Users\chris\eigeneSlots-build-desktop-Qt_4_8_0_for_Desktop_-_MSVC2010__Qt_SDK__Debug\..\eigeneSlots\mainwindow.cpp:33: Fehler:C2664: 'bool QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 3 from 'zweitesFenster' to 'const QObject *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSignalMapper> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); QSignalMapper *signalMapper; private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
zweitesfenster.h
#ifndef ZWEITESFENSTER_H #define ZWEITESFENSTER_H #include <QWidget> class zweitesFenster : public QWidget { Q_OBJECT public: zweitesFenster(); public slots: void musikrichtungGeklickt(int richtung); }; #endif // ZWEITESFENSTER_H
main.cpp
#include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QVBoxLayout> #include <QPushButton> #include <QSignalMapper> #include "zweitesfenster.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { zweitesFenster *window2 = new zweitesFenster(); QWidget *window = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(); QList<QPushButton *> buttonfield; signalMapper = new QSignalMapper(); for (int i=0; i< 5 ;i++) { QString tmp = ""; QPushButton *buttons= new QPushButton; buttons->setText(tmp.setNum(i)); buttonfield.append(buttons); layout->addWidget(buttons); connect(buttons, SIGNAL(clicked()), signalMapper, SLOT(map())); signalMapper->setMapping(buttons, i); } connect(signalMapper, SIGNAL(mapped(int)), window2, SLOT(musikrichtungGeklickt(int))); window->setLayout(layout); window->show(); //ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; }
zweitesfenster.cpp
#include "zweitesfenster.h" #include <QDebug> zweitesFenster::zweitesFenster() { } void zweitesFenster::musikrichtungGeklickt(int richtung){ qDebug () << richtung; qDebug () << "klicked"; }
-
Dein window2 ist kein Zeiger. Entweder machst du einen Zeiger draus oder du benutzt den & Operator.
-
Ok danke, ein Fehler behoben.
Nun bekomme ich aber immer noch:..Object::connect: No such slot QWidget::musikrichtungGeklickt(int) in ..\eigeneSlots\mainwindow.cpp:33
-
Wird überhaupt der moc über zweitesfenster.h laufen gelassen?
-
was meinst du damit?
Ich nutze den Qt Creator.
Die anderen .h, und .cpp files in Projekten compiliert er auch.
-
Furtano schrieb:
was meinst du damit?
Ich nutze den Qt Creator.
Die anderen .h, und .cpp files in Projekten compiliert er auch.OK, dann sollte der moc auch aufgerufen werden. Dann weiß ich auch nicht weiter.
-
du musst das makro Q_OBJECT in der klasse im header von zweitfenster eintragen ansonsten generiert moc keinen zusätzlichen code für slots und co..
siehe auch http://doc.qt.nokia.com/4.7-snapshot/signalsandslots.html für mehr details
-
Ok, hab ich gemacht.
Jetzt bekomme ich immer noch Fehler:
zweitesfenster.obj:-1: Fehler:LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall zweitesFenster::metaObject(void)const " (?metaObject@zweitesFenster@@UBEPBUQMetaObject@@XZ)
zweitesfenster.obj:-1: Fehler:LNK2001: unresolved external symbol "public: virtual void * __thiscall zweitesFenster::qt_metacast(char const *)" (?qt_metacast@zweitesFenster@@UAEPAXPBD@Z)
zweitesfenster.obj:-1: Fehler:LNK2001: unresolved external symbol "public: virtual int __thiscall zweitesFenster::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@zweitesFenster@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
debug\eigeneSlots.exe:-1: Fehler:LNK1120: 3 unresolved externals
Und habe jetzt das Projekt noch mal erstellt, dann bekomme ich den Fehler:
moc_zweitesfenster.obj:-1: Fehler:LNK2019: unresolved external symbol "public: void __thiscall zweitesFenster::musikrichtungGeklickt(int)" (?musikrichtungGeklickt@zweitesFenster@@QAEXH@Z) referenced in function "private: static void __cdecl zweitesFenster::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)" (?qt_static_metacall@zweitesFenster@@CAXPAVQObject@@W4Call@QMetaObject@@HPAPAX@Z)
-
Ganz ehrlich. Hör bitte auf mit diesen Fragen. Lies einfach was der Compiler/Linker dir sagt und beheb das. Das ist absolut straight forward.
-
Ich weiß an dieser Stelle wirklich nicht weiter.
Ich habe doch schon versucht das Projekt neu zu erstellen und jetzt bekomme ich diesen anderen Fehler.Mit:
unresolved external symbol "public: void __thiscall zweitesFenster::musikrichtungGeklickt(int)"kann ich nichts anfangen!
-
OK DANKE,
habe noch mal drübergeschaut und im Endeffekt wars nur noch das Projekt noch mal zu erstellen und ich habe die Implementierung des Slots auch noch vergessen einzufügen von alten Projekt. Jetzt gehts
-
Furtano schrieb:
Mit:
unresolved external symbol "public: void __thiscall zweitesFenster::musikrichtungGeklickt(int)"kann ich nichts anfangen!
Schön, dass es bei dir jetzt läuft. Kannst du jetzt auch den Zusammenhang erkennen? Unresolved external symbol bedeutet zu 99%, dass du eine Funktion deklariert, aber nicht definiert hast.
-
Ja nachdem du gesagt hast ich solls noch mal lesen, bin ich drauf gekommen
-
Mechanics schrieb:
Unresolved external symbol bedeutet zu 99%, dass du eine Funktion deklariert, aber nicht definiert hast.
Bei Qt ist es aber leider etwas komplizierter. Das Q_OBJECT-Macro fügt Deklarationen von virtuellen Funktionen ein, die dann später durch den moc implementiert werden. Ist der entsprechende Header aber nicht unter HEADERS im .pro aufgeführt, erzeugt qmake keinen moc-Aufruf, wodurch eben jene Implementierungen fehlen -> undefined reference.