QT - Warum reagieren meine Slots/Signals nicht?



  • Hi,

    also, ich habe eine eigene Klasse mit Slots und Signals. Dabei verbinde ich die Dinger untereinander. Leider reagiert das Programm nicht, wenn ich die Signals auslöse. Es geht um einen QTextEdit dem mit setPlainText() ein neuer Inhalt gegeben werden soll.

    Hier mal die relevanten Teile meines Codes:

    class Model: public QWidget
    {   
        Q_OBJECT
    
        public: 
            Model(QWidget *parent=0);
    
        public slots:
            void open();
    
        signals: 
            void newHeader(const QString*);
    };
    

    Die Funktion open() ist so implementiert:

    void Model::open()
    {
        QString test=tr("test");
        emit newHeader(&test);
    }
    

    In einer anderen Klasse connecte ich ein paar Slots:

    boxlayout ist ein VBoxLayout, model ein Zeiger auf ein Model (header siehe oben)

    QTextEdit *header=new QTextEdit;
    boxlayout->addWidget(header);
    connect(model, SIGNAL(newHeader(const QString*)), header, SLOT(setPlainText(const QString*)));
    

    Außerdem wird ein QAction mit dem open()-slot verbunden:
    File ist ein QMenu

    QAction *open=new QAction(tr("&open"), this);
    open->setShortcut(tr("Ctrl+O"));
    open->setStatusTip("Opens an existing File");
    connect(open, SIGNAL(triggered()), model, SLOT(open()));
    file->addAction(open);
    

    Auf Dauer soll der open()-Slot eine Datei öffnen und über das newHeader()-Signal in den TextEdit schreiben. Derzeit gibt es, wie ihr seht, nur einen Teststring aus. Dieser wird im QTextEdit nicht angezeigt. Was habe ich falsch gemacht?

    Danke schonmal für eure Hilfe,
    campino



  • connect(model, SIGNAL(newHeader(const QString*)), header, SLOT(setPlainText(const QString*)));
    

    Frage 1: wird newHeader signal überhaupt ausgelöst? Eventuell über ein Test-Slot testen.

    void Model::open()
    {
        QString test=tr("test");
        emit newHeader(&test);
    }
    

    Frage 2: Kann es sein, dass nach dem Signal test gar nicht mehr besteht? (Pointer auf temporäre Variable?)



  • hi,
    erstmal danke 😉

    ich hab mal einen testSlot angelegt:

    void MainWidget::testSlot(const QString* test)
    {
        QString* text=new QString("testSlot: ");
        text->append(*test);
        QMessageBox::warning(this, "ERROR", *text);
    }
    

    über connect mit dem newHeader-Signal verbunden, wird fehlerfrei eine MessageBox mit dem Text darin dargestellt. Nur mien QEditText reagiert nicht. Muss man vielleicht noch ein update() oder so auslösen?



  • Try this:

    signal: void newHeader(const QString &);

    void Model::open()
    {
    QString test=tr("test");
    emit newHeader(test);
    }

    connect(model, SIGNAL(newHeader(const QString&)), header, SLOT(setPlainText(const QString&)));



  • Hi, ich greife diesen Thread mal auf, weil ich ein ähnliches Problem habe.

    Ich habe zwei Klassen: ioServerGUI und ioServer.
    Im ioServerGUI wird ein Objekt von ioServer erstellt.
    Um mir Statusmeldungen vom Server in einem QTextEdit auf dem GUI ausgeben lassen zu können, habe ich mir ein eigenes Signal "serverStatusChanged()" in der Klasse ioServer erstellt.
    ioServerGUI hat nun einen Slot "writeServerLog()"
    Die beiden sind im Konstruktor der ioServerGUI-Klasse so verbunden

    ioserver = new ioServer(this);
    
    connect(ioserver, SIGNAL(serverStatusChanged()), this, SLOT(writeServerLog()));
    

    Im Konstruktor der ioServer-Klasse lasse ich das Signal direkt ausgeben:

    emit serverStatusChanged()

    Warum wird der Slot dennoch nicht ausgeführt? Hat jemand ne Idee? Wenn ich den Slot im Konstruktor der ioServerGUI direkt mit "writeServerLog()" aufrufe, funktionierts. Das Signal kommt einfach nicht über?

    Muss ich irgendwas in den header-files besonders eintragen?

    Bin für jeden Ansatz dankbar.

    Grüße
    meph



  • Sorry fuer die spaete Antwort..

    Hast du ueberall wo Signals oder Slots sind das Q_OBJECT Macro eingetragen? Leiten alle Klassen, die Signals oder Slots benutzen von QObject ab? Hast du ein komplettes make distclean && make ausprobiert (manchmal wirds nicht richtig kompiliert, nachdem man das QObject Makro eingefuegt hat)?

    Bis du ganz sicher, dass die Namen von Slot und Signal im connect(..) gleich sind? Parameterliste ist auch ueberall gleich? Weil Qt gibt da nicht immer Fehlermeldungen raus.

    So das sind mal die Fehler, die ich oeffters hatte. Vielleicht hilft es ja..



  • Vielen Dank.

    Die Fehler kenn ich auch 😉 Passieren einem ja gern mal. Aber daran lag es nicht. Ich hab das Signal im Konstruktor zu früh emitiert.

    Grüße
    meph


Anmelden zum Antworten