Если вы действительно не хотите исследовать многопоточное решение, что было бы лучше, вы можете использовать тайм-аут специального случая с 0. В основном, когда вы запускаете таймер с таймаутом 0, он запускает соответствующий код после обработки событий, которые в данный момент находятся в очереди событий. Итак, вы можете настроить что-то вроде этого:
class MyDialog : public QDialog
{
Q_OBJECT
public:
MyDialog()
{
m_step = 0;
QTimer::singleShot( 0, this, SLOT( Process() ) );
}
public slots:
void Process()
{
// do calculations
m_step++;
QTimer::singleShot( 0, this, SLOT( Redraw() ) );
if ( m_step != 1000 )
QTimer::singleShot( 0, this, SLOT( Process() ) );
}
void Redraw() { // do redrawing code here }
private:
int m_steps;
};
А затем объедините его с основным кодом Qt:
int main( int argc, char** argv )
{
QApplication app( argc, argv );
MyDialog dialog;
dialog.show();
return ( app.exec() );
}