Seite 1 von 1
Button während Event blockieren
Verfasst: 2. Mai 2017 13:48
von Benj
Hallo,
folgendes Problem:
Code: Alles auswählen
void MainWindow::on_refreshBtn_clicked()
{
ui->refreshBtn->disconnect();
loadInterfaces();
ui->refreshBtn->connect(ui->refreshBtn,SIGNAL(clicked(bool)),this,SLOT(on_refreshBtn_clicked()));
}
Falls/solange das on_refreshBtn_Cklicked() Event gerade seinen Code ausführt, soll ein Click auf den Refreshbutton ignoriert werden. Offenbar wird der Refresh Button aber nie Blockiert, während loadInterfaces() ausgeführt wird. Wird der Refresh-Button 10 mal schnell geklickt wird loadInterfaces auch 10 mal nacheineander ausgeführt.
Was mache ich falsch?
Re: Button während Event blockieren
Verfasst: 2. Mai 2017 19:32
von Christian81
Qt hat gar keine Zeit die anderen Events zu verwerfen da zwischen dem disconnect und dem connect die Eventloop nirgends aufgerufen wird. D.h. die Events können nicht abgearbeitet werden.
btw: QObject::connect() ist eine statische Funktion, nicht nötig ui->refreshBtn->connect() zu schreiben
Re: Button während Event blockieren
Verfasst: 2. Mai 2017 20:06
von Benj
Heisst das die Events werden linear hintereinander und nicht paralell abgearbeitet. Wäre es der richtige Lösungsansatz das Event in einem seperaten Thread zu packen? Sorry, ich hatte mit Threads noch kaum was zu zu zun, in c++ schon gar nicht...
MfG
Re: Button während Event blockieren
Verfasst: 3. Mai 2017 06:22
von Christian81
Wieso sollten sie parallel abgearbeitet werden bzw. wie sollte das funktionieren?
Re: Button während Event blockieren
Verfasst: 3. Mai 2017 07:14
von Benj
Das Problem ist: wenn man den Button mehrmals klickt, dann wird mehrmals mal eine Processbar aufgerufen und nacheinander abgearbeitet. Das sieht nicht schön aus und das komplette Programm blockiert, bis alles abgearbeitet wurde.
Natürlich könnte man sagen "selbst schuld", man braucht ja auch nicht 10 mal klicken! Wäre aber keine Lösung.
Re: Button während Event blockieren
Verfasst: 5. Mai 2017 09:24
von veeman
Je nach dem was deine loadInterfaces Funktion macht hast du mehrere Möglichkeiten:
Wenn ein weiteres Fenster erzeugt wird:
1. Ein
Modalen Kinderdialog verwenden (ggf. ableiten).
2. Für die dauer wie dieses angezeigt wird den Button deaktivieren. (setEnabled)
Sonstiges:
3. Ggf mit
bool QObject::blockSignals(bool block) oder auch mit der Klasse
QSignalBlocker temporär die Signale des Buttons blockieren.