Qt progressBar получает необработанное исключение, как определить, когда родительский виджет завершил загрузку - PullRequest
0 голосов
/ 30 марта 2011

я использую Qt QProgressBar и помещаю его в строку состояния в моем главном окне Вот так в конструкторе:

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

затем я запускаю процессы (в этом случае загрузка веб-страницы) и пытается показать прогресс с:

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

Но я получаю необработанное исключение, когда дело доходит до pb-> show () Я предполагаю, что это должно сделать что-то с загрузкой родительского главного окна, а затем индикатор выполнения Я читал о QAbstractEventDispatcher и processEvents, но не понял, как его реализовать.

Я сделал небольшой тест и поместил вызов функции pb-> show () в сигнал нажатия кнопки / шлюха это означает, что я запускаю pb-> show () после того, как веб-страница и главные окна полностью загружены и все работает без исключений. что заставляет меня верить, есть проблема с обработкой событий.

вот класс:

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();
    } 
}

1 Ответ

2 голосов
/ 30 марта 2011

В вашей функции createWebViewActions() вы подключаете сигналы к соответствующим слотам.(Одно небольшое замечание: соединение для сигнала titleChanged(QString) и слота adjustTitle() не выполняется, поскольку они имеют разные подписи)

Среди прочего вы подключаете сигнал loadProgress(int) к слоту setProgress(int).В этом слоте вы вызываете adjustTitle(), где выполняется инструкция pb-> show ().

Обратите внимание, что вы вызываете функцию createWebViewActions() перед вызовом конструктора 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);
(...)

Я думаю, что, возможно, этот слот (setProgress()) вызывается до создания QProgressBar, который вызывает необработанное исключение, которое вы получаете.

Вы можете попробовать переместить вызов в конструктор QProgressBar, чтобы он создавался до соединения со слотами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...