Button während Event blockieren

Alles rund um die Programmierung mit Qt
Antworten
Benj
Beiträge: 9
Registriert: 14. April 2017 10:52

Button während Event blockieren

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button während Event blockieren

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Benj
Beiträge: 9
Registriert: 14. April 2017 10:52

Re: Button während Event blockieren

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Button während Event blockieren

Beitrag von Christian81 »

Wieso sollten sie parallel abgearbeitet werden bzw. wie sollte das funktionieren?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Benj
Beiträge: 9
Registriert: 14. April 2017 10:52

Re: Button während Event blockieren

Beitrag 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.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Button während Event blockieren

Beitrag 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.
Antworten