2011-03-30 3 views
0

im en utilisant Qt QProgressBar et le placer dans la barre d'état sur ma fenêtre principale Comme cela dans le constructeur:Qt progressBar faire exception non gérée comment détecter quand widget parent chargement effectué

pb = new QProgressBar(statusBar()); 
pb->setTextVisible(false); 
pb->hide(); 
statusBar()->addPermanentWidget(pb); 

puis im en cours d'exécution procsses (web Page loadding dans ce cas) et d'essayer de montrer les progrès avec:

connect(ui.webView, SIGNAL(loadProgress(int)), SLOT(setProgress (int))); 
void myMainWindow:: setProgress(int progress) 
{ 
pb->show(); 
pb->setRange(0,100); 
pb->setValue(progress); 
} 

Mais im obtenir exception non gérée quand il vient à PB-> show() Je suppose qu'il doit faire savoir quelque chose h chargement des fenêtres principales parent, puis la barre de progression Je lisais à propos de QAbstractEventDispatcher et processEvents mais pas compris comment l'implémenter. J'ai fait un petit test et mis l'appel de la fonction pb-> show() dans le bouton click signal/slut ce qui signifie im déclencher le pb-> show() après la page Web et les fenêtres principales entièrement chargées et son fonctionnement bien sans exception. cela me fait croire il y a problème avec le traitement de l'événement.

ici est la classe:

class MainWindowMainWindowContainer : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    MainWindowContainer(QWidget *parent = 0); 

public slots: 

    void adjustLocation(); 
    void changeLocation(); 
    void adjustTitle(); 
    void setProgress(int p); 
    void finishLoading(bool); 
    void finishedSlot(QNetworkReply* reply); 


private: 
    Ui::OnLineBack_mainWindow ui;  
    int progress; 

    void createWebViewActions(); 
    QProgressBar *pb; 
    void setprogressBar(int progress,bool show); 

}; 

MainWindowContainer::MainWindowContainer(QWidget* parent) : 
    QMainWindow(parent), 

{ 
ui.setupUi(this); 
progress = 0; 


createWebViewActions(); 
ui.webView->load(QUrl("www.cnnnn.com")); 
ui.webView->show(); 

pb = new QProgressBar(statusBar()); 
pb->setTextVisible(false); 
pb->hide(); 
statusBar()->addPermanentWidget(pb); 
} 
void MainWindowContainer::createWebViewActions() 
{ 
    connect(ui.webView, SIGNAL(loadFinished(bool)), SLOT(adjustLocation())); 
    connect(ui.webView, SIGNAL(titleChanged(QString)), SLOT(adjustTitle())); 
    connect(ui.webView, SIGNAL(loadProgress(int)), SLOT(setProgress(int))); 
    connect(ui.webView, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool))); 
    connect(ui.webView, SIGNAL(linkClicked(const QUrl&)),this, SLOT(linkClicked(const QUrl&))); 

} 
void MainWindowContainer::setProgress(int p) 
{ 
    progress = p; 
    adjustTitle(); 
} 
void MainWindowContainer::adjustTitle() 
{ 
    qApp->processEvents(); 

    pb->show(); 
    if (progress <= 0 || progress >= 100) 
    { 
     QString titl = ui.webView->title(); 
     statusBar()->showMessage(titl); 
     setprogressBar(-1,false); 

    } 
    else 
    { 

     statusBar()->showMessage(QString("%1 (%2%)").arg(ui.webView->title()).arg(progress)); 
     setprogressBar(progress,true); 
    } 
} 

void MainWindowContainer::finishLoading(bool) 
{ 
    progress = 100; 
    adjustTitle(); 

} 
void MainWindowContainer::setprogressBar(int progress,bool show) 
{ 
    if(show) 
    { 
     pb->show(); 
     pb->setRange(0,100); 
     pb->setValue(progress); 
    } 
    else 
    { 
     pb->hide(); 
    } 
} 
+0

Je pense que nous avons besoin de plus de code pour déterminer ce qui est faux. Si vous avez créé votre widget, appeler -> show() est très bien. Vous n'avez pas besoin de "attendre le chargement" widget. Vous faites quelque chose d'autre qui ne va pas. –

+0

quel code avez-vous besoin de plus? im appelant l'application fenêtre principale avec: MainWindowContainer mainWindowContainer; mainWindowContainer.show(); – user63898

+0

Où est défini pb? Où se connecte la connexion? –

Répondre

2

Dans votre fonction createWebViewActions() vous connecter les signaux à leurs emplacements respectifs. (Une petite remarque, la connexion pour le signal titleChanged(QString) et adjustTitle() emplacement échoue parce qu'ils ont des signatures différentes)

Entre autres, vous vous connectez le signal loadProgress(int) à la fente setProgress(int). Dans cet emplacement, vous appelez adjustTitle() où l'instruction pb-> show() est en cours d'exécution.

Notez que vous appelez la fonction createWebViewActions() avant l'appel au constructeur QProgressBar

(...) 
createWebViewActions(); <------ here you establish the signal->slot connections 
ui.webView->load(QUrl("www.cnnnn.com")); 
ui.webView->show(); 

pb = new QProgressBar(statusBar()); <------ here you call the QProgressBar constructor 
pb->setTextVisible(false); 
pb->hide(); 
statusBar()->addPermanentWidget(pb); 
(...) 

Je pense que peut-être cette fente (setProgress()) est appelée avant l'QProgressBar est construit qui déclenche l'exception non gérée que vous obtenez.

Vous pouvez essayer de déplacer l'appel vers le constructeur QProgressBar afin qu'il soit créé avant la connexion des logements.

+0

Merci c'est la réponse ... – user63898