Anzeige:
Ergebnis 1 bis 8 von 8

Thema: [Qt4] Signal emitten im QWidget-Konstruktor

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13

    [Qt4] Signal emitten im QWidget-Konstruktor

    Hi Leute,

    ich habe vor, einen QWidget-Dialog zu erstellen und gleichzeitig, also beim Anzeigen des Dialogs ein Signal starten, welcher dann einen ProgressBar-Thread startet.
    Mit Buttons, die ich im Dialog platziert hab, klappt es wunderbar. Im Konstruktor ist nicht möglich. Gibt's da ne Möglichkeit, vielleicht mit Events?

    Grüße
    proggy
    Geändert von proggy (19-03-2006 um 18:11 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Boron
    Registriert seit
    07.01.2002
    Beiträge
    827
    Es gibt die emit()-Methode.
    Wenn dein Dialog damit dasSignal sendest UND der ProgressBar bereit existiert (dessen Konstruktor wurde aufgerufen), dann sollte es eigentlich funktionieren.
    Gruß Boron (der sich oft wegen mieser Rechtschreibung anderer die Augen reiben muss)

    LINUX IS LIKE AN INDIAN TENT: NO GATES, NO WINDOWS AND AN APACHE INSIDE!
    Hardware Monitoring unter Linux -> http://santafu.sourceforge.net (Temperaturen, Lüfterdrehzahlen und Spannungen)

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13
    Hi,

    danke für die Antwort.
    Ich habe den Konstruktor von QProgressBar aufgerufen. Das Konzept mit Signals und Slots kenne ich auch.
    Hab es auch schon mit den showEvent() bzw. event()-Methoden+QEvent::Show von QWidget versucht. Klappt auch nicht.

    Dazu muss ich sagen, dass ich unter Windows programmiere.

    Hier noch einmal Code-Schnipsel aus meinem Programm:

    main.cpp:
    Code:
    ...
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        SysCheckWidget widget;
        widget.setMaximumWidth(400);
        widget.show();
        
        CQueue queue;
        QObject::connect(&widget,SIGNAL(SIGStartThread()), 
                                 &queue, SLOT (SLOTStartThread()));
        QObject::connect(&queue,SIGNAL(SIGProgBar(int)),
                                 &widget, SLOT (slotAddValue(int)) );
        return app.exec();
    }
    
    ....
    check_sys.cpp:
    Code:
    SysCheckWidget::SysCheckWidget(QWidget *parent) : QWidget(parent)
    {
    o_System = new CSystemCheck(this);
    sysProgressBar = new QProgressBar(this);
    butStart = new QPushButton("Start", this);
    
    ....
    connect( o_System, SIGNAL(signalSetProgressBar(int)), this,
                                           SLOT(slotAddValue(int)));
    connect(butStart,SIGNAL(clicked()),this,
                                           SLOT(SLOTStartProgressBar()));
    ...
    SLOTStartProgressBar();
    }
    
    void SysCheckWidget::slotAddValue(int addValue)
    {
    	if ( addValue >= 0 && addValue < 100 )
    	{
    		sysProgressBar->setValue(sysProgressBar->value() + addValue);
    	}
    	else if ( addValue == 100 )
    	{
    		sysProgressBar->setValue(100);
    		AddMessage(tr("System OK.\n"), TRUE);
    	}
    	else
    	{
    		sysProgressBar->setValue(0);
    	}
    }
    
    void SysCheckWidget::SLOTStartProgressBar()
    {
    	if (StartCheckSystem())
    	{
    		// hier geht er auf jeden Fall rein!!!!
    		emit SIGStartThread();
    	}
    }
    Nun wenn ich auf den Start-Button (butStart) klicke, geht es.
    Hab auch schon das connect mit o_System entfernt. Das gleiche Ergebnis. Start-Button funktioniert, beim Anzeigen des Widgets nicht.

    Grüße proggy

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Kurzer Einwurf:

    Wenn du das Signal im Konstruktor emittest, kannst du es außerhalb noch gar nicht connected haben, weil du zum Connected bereits das fertige Objekt brauchst.

    Insofern sind Signals im Konstruktor ziemlich sinnfrei

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13
    Nabend!
    Danke für die Antwort.
    Stimmt. Der Konstruktor muss wohl zu Ende abgearbeitet werden...
    Vielleicht hab ich das falsch formuliert. Es geht mir nur grundsätzlich darum, das Signal ohne eine Aktion, sprich Klicken auf Button o.ä., auszuführen. Das muss doch auf irgendeine Weise möglich sein, oder? Vielleicht fällt euch was ein? Vielleicht hab ich zur Zeit den Scheuklappenblick...

    Beim show-Event hat es auch nicht funktioniert, obwohl das fertige Objekt vorliegt. Ebenfalls führt er den Signal nicht aus, wenn ich wie im Programm SLOTStartProgressBar() von main.cpp ausführe.

    Ich danke für jede Antwort...
    Grüße proggy

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich mache sowas meistens über einen Singleshot Timer, siehe QTimer.

    Allerdings sollte es in showEvent schon gehen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13

    Thumbs up [Qt] [Gelöst] Auslösen von Signal beim/nach Anzeigen eines QWidget-Fensters

    Jepp, das war die Lösung!

    Der Single-Shot ( ts, ts, ihr ollen Trolltech-Heinis!) war's!

    Jetzt funktioniert es wunderbar!

    Code:
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        SysCheckWidget widget;
        widget.setMaximumWidth(400);
        widget.show();
        QTimer::singleShot(100, &widget, SLOT(SLOTStartProgressBar()));    
    
        CQueue queue;
        QObject::connect(&widget,SIGNAL(SIGStartThread()), 
                                 &queue, SLOT (SLOTStartThread()));
        QObject::connect(&queue,SIGNAL(SIGProgBar(int)),
                                 &widget, SLOT (slotAddValue(int)) );
        return app.exec();
    }
    1000 Dank anda!

    Hm! Komisch nur, dass zwar das showEvent aufgerufen wird, jedoch das SIGNAL verloren geht.

    Grüße Greg

  8. #8
    Registrierter Benutzer
    Registriert seit
    28.07.2005
    Beiträge
    13
    Geistesblitz! So jetzt funktioniert es auch mit dem showEvent()!!!

    Der show() - Methode muss hinter die beiden connects wie im Listing. Logisch!

    Code:
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        SysCheckWidget widget;
        widget.setMaximumWidth(400);
        
        CQueue queue;
    	QObject::connect(&widget,SIGNAL(SIGStartThread()), &queue, SLOT (SLOTStartThread()));
    	QObject::connect(&queue,SIGNAL(SIGProgBar(int)), &widget, SLOT (slotAddValue(int)) );
    	
        widget.show();
        return app.exec();
    }
    Grüße

Lesezeichen

Berechtigungen

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