Expected Primary-expression befor ')' token und problem mit OnClick slot[gelöst]



  • Arkathor schrieb:

    manni66 schrieb:

    Was tut das denn deiner Meinung nach?

    QObject::sender(*QPushButton)
    

    Ich denke es soll an den Sender(eigentlich Adresse des Senders, da es ein Zeiger Parameter ist) zugreifen und dessen Text (in C Builder wäre es Caption) überprüfen, ich habe es auch als normalen Parameter eingestellt (nicht als Zeiger) und kriege nur eine zusätzliche Fehlermeldung in Zeile 37 "Fehler:expected primary-expression before 'unsigned'"

    Wenn du den Parameter benutzen möchtest, müsste es etwa so lauten:

    char Richtung=static_cast<QPushButton*>( Sender )->text[0];
    

    - Groß-/Kleinschreibung werden in C++ beachtet
    - Indexe beginnen bei 0

    Im Konstruktor im connect-Aufruf funkrioniert das natürlich nicht. Ausserdem kannst du im connect nicht einfach eine Funktion mit einem Parameter eintragen, wenn das signal diesen Parameter nicht liefert.

    Du solltest dich vielleicht erst mal auf die Umgebung, wie ihr sie in der Schule benutzt, konzentrieren, bis du im Umgang mit C++ sicherer bist.



  • manni66 schrieb:

    Wenn du den Parameter benutzen möchtest, müsste es etwa so lauten:

    char Richtung=static_cast<QPushButton*>( Sender )->text[0];
    

    - Groß-/Kleinschreibung werden in C++ beachtet
    - Indexe beginnen bei 0

    Im Konstruktor im connect-Aufruf funkrioniert das natürlich nicht. Ausserdem kannst du im connect nicht einfach eine Funktion mit einem Parameter eintragen, wenn das signal diesen Parameter nicht liefert.

    Du solltest dich vielleicht erst mal auf die Umgebung, wie ihr sie in der Schule benutzt, konzentrieren, bis du im Umgang mit C++ sicherer bist.

    Danke für den Letzten Rat, es geht aber schlecht da ich in diesem Jahr Abi schreibe und viel üben muss (Bestandteile sind Theory und eben Programmerung in C++ und Pascal). Deinen Rat mit den Parametern bei connect habe ich mir beherzigt und habe, alles so angeglichen wie es in tutorials war:

    QObject::connect(this,SIGNAL(clicked()),this,SLOT(OnClick()));
    

    Ich habe es auch versucht sowohl die Zeile die du als Vorschalag gegeben hast, als auch Lösung die wir vom Lehrer als Handout bekommen haben zu nehmen. Leider funktionieren beide nicht:

    char Richtung=((QPushButton*)sender)->text[0];  // Fehler:invalid use of member (did you forget the '&' ?)
    char Richtung=static_cast<QPushButton*>( sender )->text[0];  //Fehler:invalid static_cast from type '<unresolved overloaded function type>' to type 'QPushButton*'
    

    Beide haben Fehlermeldungen verursacht die ich ins Kommentar geschrieben habe. Zusätzlich dazu bekomme ich in Zeile 37 Fehlermeldung: Fehler:expected primary-expression before 'unsigned' . Ich würde mich freuen wenn jemand mir sagen würde was Falsch an dem Queltext ist.



  • Vielleicht:

    ui->textEdit_2->setText((unsigned char *) index);
    

    Und dann probier erst mal dies:

    char Richtung=qobject_cast<QPushButton *>( sender )->text[0];
    

    Ansonstne dies:

    char Richtung=dynamic_cast<QPushButton *>( sender )->text[0];
    

    Und zum Schluss das:

    char Richtung=(QPushButton *)(sender))->text[0];
    


  • ui->textEdit_2->setText((unsigned char *) index);
    

    Das hat funktioniert, wenn ich das ganze mit unsigned gelöscht habe, sonst bekam ich "Fehler:invalid conversion from 'unsigned char*' to 'const char*' "

    char Richtung=qobject_cast<QPushButton *>( sender )->text[0];
    

    Fehler:no matching function for call to 'qobject_cast(<unresolved overloaded function type>)'

    char Richtung=dynamic_cast<QPushButton *>( sender )->text[0];
    

    Fehler:cannot dynamic_cast '((MainWindow*)this)->QObject::sender' (of type '<unresolved overloaded function type>') to type 'class QPushButton*' (source is not a pointer)

    char Richtung=(QPushButton *)(sender))->text[0];
    

    Fehler:invalid use of member (did you forget the '&' ?)

    Also ich habe alle von euch angegebene Optionen ausprobiert und immer wieder kommt es zu Fehlermeldung in dieser Zeile.
    Vieleicht gibt es einen anderen Weg um es zu machen, was ich will. Es geht nämlich darum, dass mehrere Buttons(kein Button Group) mit gleichem Slot/Event auf einen Klick reagieren, und dabei ausgewertet wird was passiert (in diesem Fall ob die Liste ruck, oder vorwärts "gescrollt" wird). Die einzige möglichkeit die ich kenne besteht darin den Sender Object abzufragen. Wenn es, aber andere möglichkeit gibt dann wäre ich dankbar für weitere Lösungsvorschläge (einzelne Wörter reichen völlig aus).



  • Arkathor schrieb:

    ...
    Deinen Rat mit den Parametern bei connect habe ich mir beherzigt und habe, alles so angeglichen wie es in tutorials war:

    QObject::connect(this,SIGNAL(clicked()),this,SLOT(OnClick()));
    

    ...

    char Richtung=((QPushButton*)sender)->text[0];  // Fehler:invalid use of member (did you forget the '&' ?)
    

    Und sender ist jetzt was, wenn die Funktion OnClick keinen Parameter mehr hat?



  • Jetzt habe ich es fast geschafft (hoffe ich zumindest).
    Ich habe paar sachen geändert und nun kriege ich nur eine Fehlermeldung in zeile 28:

    void MainWindow::OnClick(QPushButton* Woul)
    {
        Woul=(QPushButton*)QObject::sender();
        QString Richtung=(QString*)Woul->text.at(0);//Fehler:'Woul->QAbstractButton::text' does not have class type
    
        if (Richtung[0]=='<') {
        if (index==3) index=1; else index++;
        } else
        if (Richtung[0]=='<') {
        if (index==1) index=3; else index--;
        };
    

    Ich habe dabei auch auf switch verzichtet, da ich Strings auswerten will und das ist mit if else leichter. Das Problem ist immer noch, dass ich nicht an Text des Buttons zugreifen kann, ich weiss aber nicht wieso es nicht funktioniert.



  • Ich kenne mich mit Qt nicht aus, aber anhand der Funktionsnamen macht mich der Code etwas stutzig. Ich bezweifel mal, das Text einen Zeiger zurückgibt:
    QString Richtung = Woul->text;

    Und dann kannst du evtl. mit Richtung[0] oder Richtugn.at(0) auf das erste Zeichen zurückgreifen.

    Wie gesagt, kenne ich mich mit Qt aber nicht aus.



  • jkljkl schrieb:

    Ich kenne mich mit Qt nicht aus, aber anhand der Funktionsnamen macht mich der Code etwas stutzig. Ich bezweifel mal, das Text einen Zeiger zurückgibt:
    QString Richtung = Woul->text;

    Und dann kannst du evtl. mit Richtung[0] oder Richtugn.at(0) auf das erste Zeichen zurückgreifen.

    Das klapt leider nicht, da kommt Fehlermeldung: Fehler:conversion from '<unresolved overloaded function type>' to non-scalar type 'QString' requested .Hier bin ich mir nicht sicher wie ich es konvertieren soll, und was dieser unresolved overloaded function type ist.



  • Was für einen Compiler benutzt du? Mir scheint der ziemlich veraltet zu sein? Die Fehlermeldung ist tatsächlich nicht so hilfreich, wie ich das gewohnt bin.



  • void MainWindow::OnClick(QPushButton* Woul)
    

    Warum hat die Funktion denn jetzt doch wieder einen Parameter?

    Woul=(QPushButton*)QObject::sender();
    

    Warum weist du einen Parameter einen Wert zu?
    Warum benutzt du einen C-Cast? Damit behauptest du dem Compiler gegenüber, du wüsstest, was du tust. Das weißt du aber definitiv nicht. Benutze static_cast oder dynamic_cast. Wenn das nicht übersetzt wird, ist etwas falsch!

    QString Richtung=(QString*)Woul->text.at(0);
    

    Warum versuchst du einem QString einen QString* zuzuweisen?
    text ist ein Property des QPushButton. Properties werden in Qt mit set<Name>( Wert ) gesetzt und mit <name>() gelesen.

    Dein Code müsste in etwa so aussehen:

    void MainWindow::OnClick()
    {
        QPushButton* Woul=dynamic_cast<QPushButton*>(QObject::sender());
        QString Richtung=Woul->text();
    


  • manni66 schrieb:

    void MainWindow::OnClick()
    {
        QPushButton* Woul=dynamic_cast<QPushButton*>(QObject::sender());
        QString Richtung=Woul->text();
    

    Danke sehr, diese Zeilen haben das Problem gelöst. Das programm funktioniert zwar immer noch nicht richtig, aber das wird bestimmt irgendeing Logik Fehler von mir sein. Danke für eure Hilfe.


Anmelden zum Antworten