# Qt ProgressDialog

**URL:** <https://www.ruby-forum.com/t/qt-progressdialog/210312>\
**Category:** IT\
**Created:** [August 4, 2011, 6:52pm UTC](https://www.ruby-forum.com/t/qt-progressdialog/210312 "2011-08-04T18:52:50Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![luislavena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@luislavena](https://www.ruby-forum.com/u/luislavena)\
**Post date:** [August 4, 2011, 6:52pm UTC](https://www.ruby-forum.com/t/qt-progressdialog/210312/1 "2011-08-04T18:52:50Z")

</div>

Ciao a tutti sono qui per chiedere un aiuto, in qunato da solo proprio  
non riesco a risolverlo, in pratica io vorrei lanciare metodo che svolge  
delle istruzzioni, e vedere mentre le svolge la progressbar che avanza,  
questo riesco a farlo con un thread come si puo vedere dal mio codice,  
però vorrei evitare di usare in thread in quanto, se eseguo istruzzioni  
più complesse tipo aprire con win32ole un file excel e copiare dei dati,  
le prestazioni sono improponibili, ho provato a togliere le istruzzioni  
dal thread ma la finestra non risponde, e mi aggiorna la progressbar  
alla fine dell’elaborazione, in pratica vorrei che la mia applicazione  
rispondesse anche quando sta elaborando qualcosa, ho provato anche con  
il trucco:  
timer=Qt::Timer.new(self)  
timer.start(10)  
connect(timer, SIGNAL(‘timeout()’), self, SLOT(‘update()’))

ma non riesco a farlo funzionare.

Grazie.

main.rb

* * *

require ‘Qt’  
require ‘window.rb’

app = Qt::Application.new(ARGV)  
win = Window.new  
win.show  
win.exec

* * *

windows.rb

* * *

class Window \< Qt::Dialog

slots ‘update()’,‘run()’

def initialize(parent = nil)  
super(parent)

```
@numberLabel = Qt::Label.new(tr("Number:"))
@numberLineEdit = Qt::LineEdit.new("Inser number")
@numberLabel.buddy = @numberLineEdit
@statusLabel = Qt::Label.new(tr("Please enter one number."))
@connectButton = Qt::PushButton.new(tr("Run"))
@connectButton.default = true
@quitButton = Qt::PushButton.new(tr("Quit"))
@progressDialog = Qt::ProgressDialog.new(self)

connect(@connectButton, SIGNAL(:clicked), self, SLOT('run()'))
connect(@quitButton, SIGNAL(:clicked), self, SLOT(:close))

topLayout = Qt::HBoxLayout.new do |t|
  t.addWidget(@numberLabel)
  t.addWidget(@numberLineEdit)
  t.addWidget(@connectButton)
end

buttonLayout = Qt::HBoxLayout.new do |b|
  b.addStretch(1)
  b.addWidget(@quitButton)
end

self.layout = Qt::VBoxLayout.new do |m|
  m.addLayout(topLayout)
  m.addWidget(@statusLabel)
  m.addLayout(buttonLayout)
end

setWindowTitle(tr("Calculator"))

```

end

def run()  
Qt::Application.overrideCursor = Qt::Cursor.new(Qt::WaitCursor)  
@statusLabel.text = tr(“Elaborazine in corso”)  
@progressDialog.labelText = tr(“Elaborazione…”)  
@progressDialog.show()  
@connectButton.enabled = false

```
@i=0
Thread.new()do
while @i<100
  sleep 0.1
  @progressDialog.maximum = 100
  @progressDialog.value = @i
  @i=@i+1
end

```

end  
end

end

---

<div class="post-metadata">

**Author:** ![barbz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/dbc845/32.png) [@barbz](https://www.ruby-forum.com/u/barbz)\
**Post date:** [August 4, 2011, 10:29pm UTC](https://www.ruby-forum.com/t/qt-progressdialog/210312/2 "2011-08-04T22:29:50Z")

</div>

Il giorno 04 agosto 2011 18:52, michele boscolo [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> 

Leggi la documentazione della classe QProgressDialog  
[http://doc.qt.nokia.com/4.6/qprogressdialog.html](http://doc.qt.nokia.com/4.6/qprogressdialog.html)  
C’ un esempio dell’uso di QTimer

Operation::Operation(QObject \*parent) : QObject(parent), steps(0)  
{  
pd = new QProgressDialog(“Operation in progress.”, “Cancel”, 0,  
100);  
connect(pd, SIGNAL(canceled()), this, SLOT(cancel()));

```
 t = new QTimer(this);
 connect(t, SIGNAL(timeout()), this, SLOT(perform()));
 t->start(0);

```

}

void Operation::perform()  
{  
pd-\>setValue(steps);  
//… perform one percent of the operation  
steps++;  
if (steps \> pd-\>maximum())  
t-\>stop();  
}

void Operation::cancel()  
{  
t-\>stop();  
//… cleanup  
}

In pratica crea un oggetto QProgressDialog, collega il bottone Cancel al  
metodo Operation::cancel che blocca il timer con t-\>stop, crea un  
oggetto QTimer, lo collega al metodo Operation::perform (dove esegue la  
long  
running operation ed aggiorna la progress bar) e fa partire il timer  
con t-\>start.  
Tu devi fare lo stesso.

La classe QTimer simula il thread eseguendo il metodo perform ad  
intervalli  
regolari.  
Ogni X millisecondi chiamando perform aggiorna la progress bar  
(con pd-\>setValue) ed esegue uno step della long running operation.

Qui [QTimer - making timers in PyQt4](http://www.rkblog.rk.edu.pl/w/p/qtimer-making-timers-pyqt4/) ci sono  
altri esempi in python sull’uso di QTimer.

Ciao  
Sergio

p.s. se non trovi tutorial in ruby su Qt ti consiglio di leggere  
[MANTAP555 | Login Resmi Link Apk Online Akses Mudah Permainan Lancar Ringan Dimainkan](http://diotavelli.net/PyQtWiki/Tutorials) e  
[http://www.qtrac.eu/pyqtbook.html](http://www.qtrac.eu/pyqtbook.html)
