2016-10-16 7 views
1

Ich habe ein QProgressDialog, dass ich sofortQProgressDialog Anzeige nicht sofort

QProgressDialog *progress = new QProgressDialog("Downloading files...", 
    "Cancel", 0, 2*selection.size()+1); 
progress->setMinimumDuration(0); 
progress->setWindowModality(Qt::WindowModal); 
progress->setValue(0); 

Dann laufe ich eine for Schleife mit der Aufgabe angezeigt werden soll und schließlich den Maximalwert zuweisen:

for (int i = 1; i < selection.size()+1; ++i) 
{ 
    progress->setValue(2*i-1); 
    if (progress->wasCanceled()) 
    break; 
    do_half_task(); 
    progress->setValue(2*i); 
    if (progress->wasCanceled()) 
    break; 
    do_second_half(); 
} 
progress->setValue(2*selection.size()+1); 

Aber mit In diesem Code werden die Grenzen des Dialogfelds angezeigt, Transparente ohne Widgets und nur mit dem Label und der Fortschrittsleiste gefüllt, wenn eine vollständige for-Schleife abgeschlossen ist.

Ich denke, das ist, weil nur nach einer vollständigen Schleife ist, dass Qt die Dauer jedes Schritts berechnen kann, und überprüfen Sie, dass es >0 ist, die ich als Mindestdauer festlegen. Doch von der Dokumentation sehe ich

minimumDuration: int

gesetzt Wenn es auf 0, wird der Dialog immer, sobald ein Fortschritt gezeigt wird. Der Standardwert ist 4000 Millisekunden.

Von wo ich erwartet hätte, dass der Dialog sofort in der ersten Schleife nach der Einstellung progress->setValue(1) angezeigt wird. Wie kann ich meine QProgressDialog sofort erscheinen lassen?

Antwort

1

nicht sicher, ob dies für Qt paßt zu aber in C#, wenn Sie die Ausführung des Codes im selben Thread laufen wie

ProcessBar p = new ProcessBar(); 
this.Controls.Add(p); 
... 
for (int i = 0; i < 100; i++) { 
    p.Value = i; 
    Thread.Sleep(1); 
} 

dann haben Sie das Problem, dass das Formular nicht an den Code nicht erhalten wo es neu gezeichnet wird.

Vielleicht versuchen, Ihre Ausführungsschleife in einem anderen Thread zu machen?

1

Wenn Sie den Hauptthread in eine Schleife einfügen, kann er keine Ereignisverarbeitung durchführen, bis die Schleife beendet ist und Ihre Methode zurückgegeben wird.

So kann es nur alle "Paint Update" Anfragen verarbeiten, sobald Sie fertig sind.

Sie können innerhalb der Schleife QCoreApplication::processEvents() aufrufen, um für eine Weile zur Ereignisverarbeitung zurückzukehren.

+0

'setValue()' nennt bereits 'processEvents()' Ich arbeite an der Implementierung der Schleife in einem anderen Thread mit 'QtConcurrent' gemäß @MaddinTribleD Empfehlung, aber es ist ein wenig schwierig, weil meine Daten auf einem nicht gleichzeitiger Baum. Ich werde diese Antwort akzeptieren, wenn sich herausstellt, dass eine Schleife in einem anderen Thread das Problem löst. –

Verwandte Themen