Archiv verlassen und diese Seite im Standarddesign anzeigen : [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. :mad: Gibt's da ne Möglichkeit, vielleicht mit Events? :confused:
Grüße
proggy
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.
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:
...
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:
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
anda_skoa
20-03-2006, 17:19
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,
_
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... :eek:
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... :D
Grüße proggy
anda_skoa
20-03-2006, 23:25
Ich mache sowas meistens über einen Singleshot Timer, siehe QTimer.
Allerdings sollte es in showEvent schon gehen.
Ciao,
_
Jepp, das war die Lösung! :D
Der Single-Shot (;) ts, ts, ihr ollen Trolltech-Heinis!) war's!
Jetzt funktioniert es wunderbar!
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
Geistesblitz! So jetzt funktioniert es auch mit dem showEvent()!!!
Der show() - Methode muss hinter die beiden connects wie im Listing. Logisch!
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
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.