gpt4 book ai didi

c++ - Qt progressBar 获取未处理的异常如何检测父小部件何时完成加载

转载 作者:行者123 更新时间:2023-11-28 03:51:01 24 4
gpt4 key购买 nike

我正在使用 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() 函数调用放在按钮点击信号/slut 中这意味着我在网页和主窗口完全加载后触发 pb->show() 并且它的工作正常,无一异常(exception)。这让我相信有问题与事件处理。

这是类:

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

最佳答案

在您的 createWebViewActions() 函数中,您将信号连接到它们各自的插槽。 (注意一点,titleChanged(QString) 信号和 adjustTitle() 插槽的连接失败,因为它们具有不同的签名)

除此之外,您正在将信号 loadProgress(int) 连接到插槽 setProgress(int)。在此插槽中,您调用 adjustTitle(),其中正在执行指令 pb->show()。

请注意,您在调用 QProgressBar 构造函数之前调用了 createWebViewActions() 函数

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

我认为可能在构造 QProgressBar 之前调用此插槽 (setProgress()) 会触发您收到的未处理异常。

您可以尝试将调用移至 QProgressBar 构造函数,以便它在插槽连接之前创建。

关于c++ - Qt progressBar 获取未处理的异常如何检测父小部件何时完成加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com