Qt ProgressDialog

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

Il giorno 04 agosto 2011 18:52, michele boscolo [email protected] ha
scritto:

Leggi la documentazione della classe QProgressDialog
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 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
http://diotavelli.net/PyQtWiki/Tutorials e
Rapid GUI Programming with Python and Qt — book