Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17

Thema: connect eigenschaft bei qt

  1. #1
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28

    connect eigenschaft bei qt

    hi!

    also ich habe ein Problem. Ich habe ein eigenes widget erstellt. Im Anhang findet ihr die Headerdatei dieses Widget. Also ich habe nun in dem Konstruktor ein Filedialog erstellt
    QFileDialog* filedialog = new QFileDialog( this );
    filedialog->setContentsPreviewEnabled( TRUE );
    filedialog->setContentsPreview( preview, preview );
    filedialog->setPreviewMode( QFileDialog::Contents );
    filedialog->setMode( QFileDialog::ExistingFile );
    filedialog->setFilter( "Images (*.png *.xpm *.jpg *.bmp *.pnm *.gif)" );
    filedialog->setViewMode( QFileDialog::Detail );

    Das PreviewWidget habe cih vorher erstellt. Da mit ist alles in ordnung. Ich wollte nun das wenn der User eine Datei ausgewählt hat und auf den "Open" Knopf vom dem FileDialog erstellt wurde geklickt hat die Funktion open_texture des widget aufgerufen wird mit dem Filenamen. leider klappt das irgendwie nciht. Was ist an folgndem Code falsch?
    QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), qApp, SLOT( open_texture( filedialog.selectedfile() ) ));

    Danke für eure Hilfe bis dann
    AnubisTheKIng

  2. #2
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), qApp, SLOT( open_texture( filedialog.selectedfile() ) ));

    Ich glaub nicht, dass QApplication einen Slot namens open_texture hat. Überpruf doch mal das Argument Receiver von deinem connect-statement auf Richtigkeit.

  3. #3
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    Nein die QApplication hat natürlich keinen Slot namens open_texture. Das ist eine meiner Eigenen Funktionen die ich dem widget gegeben habe. Ist es denn nicht möglich auf eine meiner eigenen Funtkionen zu connecten?
    bis dann

    P.S.: muss ich meine open_texture funktion vielleicht irgendwie als slot deklarieren damit das klappt? kann das sein?
    Geändert von AnubisTheKing (24-11-2003 um 22:53 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    15.04.2002
    Beiträge
    39
    Original geschrieben von AnubisTheKing

    P.S.: muss ich meine open_texture funktion vielleicht irgendwie als slot deklarieren damit das klappt? kann das sein?
    Jepp, das ist genau die Lösung des Problems

    Hier steht kurz wies geht (habe auf die Schnelle nichts besseres gefunden): http://doc.trolltech.com/3.2/signalsandslots.html

  5. #5
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Original geschrieben von AnubisTheKing

    P.S.: muss ich meine open_texture funktion vielleicht irgendwie als slot deklarieren damit das klappt? kann das sein?
    das sowieso, aber nicht nur das. du musst auch als receiver deine eigene klasse, und nicht das app weite QApplication app angeben.

    gruss,

    Michael.

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: connect eigenschaft bei qt

    Original geschrieben von AnubisTheKing
    Was ist an folgndem Code falsch?
    QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), qApp, SLOT( open_texture( filedialog.selectedfile() ) ));
    Abgesehen von den Sachen, die die anderen schon gefunden haben, hast du noch das Problem, dass du im SLOT Macro genau wie im SIGNAL Macro nur Parametertypen angeben kannst.
    filedialog.selectedfile() ist definitiv kein Typ!

    Um auf das Signal fileSelected(const QString&) zu passen, muss der Slot ebenfalls const QString& als Parameter haben.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    also das ist nciht ganz richtig was du sagst da muss kein Parameter hin denn das hier funktioniert z.B.:
    QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), qApp, SLOT(quit()));
    oder habe ich dich einfach falsch verstanden?

    aber egal ich habe jetzt einen slot mit dem namen callopen_texture erstellt. Hier der Code:
    void MeshViewerWidgetT<M>::callopen_texture(const char *_filename)
    {
    std::cout << "call open_texture";
    if (!open_texture(_filename))
    {
    QString msg = "Cannot load texture image";
    QMessageBox::warning( NULL, w.caption(), msg, 0 );
    }
    }
    leider wird diese Funktion nicht auf gerufen. ich habe das fileselected signal hiermit mit dem slot verbunden.

    QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), this, SLOT( callopen_texture( "test" ) ));
    es funktioniert auch nicht wenn ich statt dem this ein qApp benutzte. Könnt ihr mir noch nen tipp geben wo der Fehler liegt?
    welchen reciver muss ich denn angeben? meine classe heistt MeshViewerWidgetT.

    P.S.: glaube ich habe den Fehler gefunden (aber leider keine Lösung). Es liegt wirklich an dem recive Object das angegeben werden muss. Was muss ich da hinschrieben wenn die Funktion die ich aufrufen will zu der gleichen Klasse gehört? Warum klappt this nicht?
    Ich bekomme beim ausführen meines Programmes folgende Fehler meldung:
    QObject::connect: No such slot QGLViewerWidget::callopen_texture("test")
    das ist auch gut das dies kommt den diese Funktion existerit nicht in QGLViewerWidget sondern in MeshViewerWidgetT. Wie ändere ich das nun?
    Geändert von AnubisTheKing (25-11-2003 um 22:13 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Kriegst du vielleicht irgendwelche Fehlermeldungen auf der Konsole von QObject::connect? So wie du versuchst, den Slot zu verbinden, kann das gar nicht gehen:

    1: Du kannst im connect-Statment keine Daten direkt entragen, so wie du das mit Test probiert hast.
    2: QString und const char * dürfte eigentlich nicht passen. Ich versteh nicht, warum du den Ärger mit const char * machst. QString ist schon eleganter
    3: Bei qApp passt das, weil Quit keine Daten erwartet. Du kannst gerne ein Signal, was Daten mitsendet mit einem Slot verbinden, der keine, oder weniger Daten erwartet, aber nicht umgekehrt.
    4: Weder qApp noch dein Klassenname wäre als receiver angebracht. Entweder this, wenn das connect-Statement in der Klasse steht, wo der SLOT definiert ist, oder aber der Name der INSTANZ deiner Klasse

  9. #9
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    1: Du kannst im connect-Statment keine Daten direkt entragen, so wie du das mit Test probiert hast.

    also du meinst SLOT( callopen_texture( "test" ) ) ist falsch weil fileselected seinen Datentyp an den slot weiter gibt? und ich hier also den gleichen Datentyp vorsehen muss?

    2: QString und const char * dürfte eigentlich nicht passen. Ich versteh nicht, warum du den Ärger mit const char * machst. QString ist schon eleganter

    sorry jetzt erstehe ich garnicht was du meinst. Wenn du dich daran störst das ich callopen_texture immer "test" übergebe, dann kann ich dich beruhigen, das mache ich nur zum testen wollte das nachher durch die Funktion selectedfile von dem Filedialog ersetzten, damit direkt der Name der ausgewählten Datei übergeben wird.

    3: Bei qApp passt das, weil Quit keine Daten erwartet. Du kannst gerne ein Signal, was Daten mitsendet mit einem Slot verbinden, der keine, oder weniger Daten erwartet, aber nicht umgekehrt.

    also werden von dem signal immer automatisch Daten an den Slot übermittelt?
    also wird von dem signal fileSelected ( const QString & )automatisch ein Qstring mit dem Pfad und Namend er Datei an den Slot übermittelt und ich muss bei meiner Funktion nur vorsehen das sie als Parameter ein Qstring bekommt?

    4: Weder qApp noch dein Klassenname wäre als receiver angebracht. Entweder this, wenn das connect-Statement in der Klasse steht, wo der SLOT definiert ist, oder aber der Name der INSTANZ deiner Klasse

    also das mit this funtkioniert nicht leider nicht. Keine Ahnung warum nicht. Wenn ich this benutzte such er den Slot bei der Klasse von der ich mein Widget abgeleitet habe.
    Und wenn ich es mit dem Klassennamen versuche dann bekomme ich schon beim compilieren Fehler, das will er über haupt nicht. Aber vielleicht habe cih da auch was falsch gemacht, ist egal wenn es sowieso falsch ist.
    Das mit der Instanz der Klasse kann glaube ich in meinem Fall nicht funktionieren. Ich will ja den connect nicht in der main Funktion setzten lassen wo acuh das Widget kreiert wird sondern ich will ja das connect in dem standart Konstruktor von dem Widget selber setzten lassen und dann kann ich nicht auf die Instanz zugreifen.

    Danke für deine Hilfe
    bis dann
    anubistheking

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von AnubisTheKing
    1: Du kannst im connect-Statment keine Daten direkt entragen, so wie du das mit Test probiert hast.

    also du meinst SLOT( callopen_texture( "test" ) ) ist falsch weil fileselected seinen Datentyp an den slot weiter gibt? und ich hier also den gleichen Datentyp vorsehen muss?
    Man kann nur TYPEN angeben!
    Sagte ich bereits.
    QString ist ein Typ, const QString& ist ein Typ, const char* ist ein Typ, "test" ist kein Typ.

    Die Parameter müssen in Anzahl und Reihenfolge übereinstimmen, wobei man beim Slot von rechts nahc links welche weglassen kann (also der Slot kann weniger Parameter haben als das Signal).

    Der korrekte Connect müsste lauten
    Code:
     QObject::connect( filedialog, SIGNAL(fileSelected ( const QString & )), this, SLOT( callopen_texture( const QString& ) ));
    Die Deklaration des Slots im Header sieht dann ungefähr so aus

    Code:
    class MyClass
    {
        Q_OBJECT
    private slots:
        callopen_texture(const QString& filename);
    };

    also werden von dem signal immer automatisch Daten an den Slot übermittelt?
    also wird von dem signal fileSelected ( const QString & )automatisch ein Qstring mit dem Pfad und Namend er Datei an den Slot übermittelt und ich muss bei meiner Funktion nur vorsehen das sie als Parameter ein Qstring bekommt?
    Korrekt.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    ok also das mit den parametern der Funtionen habe ich jetzt geändert die stimmen nun überein.
    habe nun folegndes stehen:
    connect( filedialog, SIGNAL(fileSelected ( const QString & )), this , SLOT( callopen_texture( const QString & ) ));
    denke mal nach dem was ihr so erzählt habt sollte das nun wirklich klappen, aber leider tut es das nciht. Ich kann nicht kompilieren. Ich bekomme folgende Fehlermeldung
    Error: Sorry, Qt does not support templates that contain
    Weiter geht der Satz nicht den mir eclipse liefert.
    Toll oder? Also daran kann ich nicht zufällig auch ncoh was drehen? Hat da einer Ahnung von euch. Meine Klasse muss ein Template sein, da kann ich nichts dran ändern.
    Bis dann udn danke für eure Hilfe
    anubistheking

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, dann vielleicht indirekt.

    Also ein QObject, dass den Slot deklariert und entweder das Template Objekt als Member hat, oder vom Template Object als Memeber gehalten wird.

    Dann von dort über normalen Methodenaufruf.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  13. #13
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    ja so habe ich das jetzt gemacht habe einfach ein zusätzliche Klasse CallTextureWidget angelegt in der ich dann einfach den slot deklariere. MeshViewerWidegt leite ich dann einfach zusätzlich von dieser Klasse ab.
    Leider habe ich nun wieder ein Problem ich bekomme nun folgenden Fehler:
    Compile meshviewer.cc -> Linux_gcc_dbg/meshviewer.o
    MeshViewerWidgetT.cc: In constructor
    `MeshViewerWidgetT<M>::MeshViewerWidgetT(QWidget*, const char*) [with M =
    MyMesh]':
    meshviewer.cc:106: instantiated from here
    MeshViewerWidgetT.cc:71: `QObject' is an ambiguous base of `
    MeshViewerWidgetT<MyMesh>'
    gmake[1]: *** [Linux_gcc_dbg/meshviewer.o] Error 1
    gmake: *** [local-build] Error 2
    Idee was das nun sein könnte?
    Also meine zusätzlich definierte Klasse sieht so aus:
    Code:
    class CallTextureWidget : public QObject
    {
            Q_OBJECT
    	public:
    		CallTextureWidget( QWidget* parent=0, const char* name=0 );
    	public slots:
    
           	void callopen_texture(const QString &)
    	{
    		std::cout << "call open_texture";
    		/*
    		if (!open_texture(_filename))
    		{
    			QString msg = "Cannot load texture image";
       	     QMessageBox::warning( NULL, w.caption(), msg, 0 );
    		}
    		*/
    	}
    };
    Also wenn ihr dazu auch noch ne Idee hättet wäre escht cool.

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    und wie sieht das Mesh Dingsbums aus?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Ort
    Pulheim
    Beiträge
    28
    jo hier sind die dateien als anhang aheb auch mal die anderen Dateien reingepackt falls du etwas in denen nach gucken musst.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •