Javascript QWebEngineView在自动滚动网页时冻结 我用C++和qt v5.91.
我在使用QWebEngineView时遇到了一个问题。它在自动扫描中冻结,然后解冻,并在自动扫描完成后恢复正常Javascript QWebEngineView在自动滚动网页时冻结 我用C++和qt v5.91.,javascript,c++,qt,loops,qtwebengine,Javascript,C++,Qt,Loops,Qtwebengine,我在使用QWebEngineView时遇到了一个问题。它在自动扫描中冻结,然后解冻,并在自动扫描完成后恢复正常 冻结: void主窗口::在加载时单击() { QUrl url=QUrl(ui->lineEdit->text()); webview->page()->加载(url); 连接(webview->page(),&QWebEnginePage::loadFinished,this,&MainWindow::on_PageLoadFinished); } void main windo
冻结:
void主窗口::在加载时单击()
{
QUrl url=QUrl(ui->lineEdit->text());
webview->page()->加载(url);
连接(webview->page(),&QWebEnginePage::loadFinished,this,&MainWindow::on_PageLoadFinished);
}
void main window::on_PageLoadFinished()
{
断开连接(webview->page(),&QWebEnginePage::loadFinished,this,&MainWindow::on_PageLoadFinished);
//获取页面的高度
webview->page()->runJavaScript(“document.body.scrollHeight”[&](constqvariant&result){set_PageHeight(result.toInt());});
}
void主窗口::设置页面高度(内部高度)
{
页面高度=高度;
滚动下载页();
}
void MainWindow::ScrollDownPage()
{
当前垂直滚动=0;
while(当前垂直滚动页面()->运行JavaScript(QString(“window.scrollTo(0,%1);”)).arg(当前垂直滚动));
当前垂直滚动+=100;
QEventLoop循环;
QTimer t;
t、 连接(&t,&QTimer::timeout,&loop,&QEventLoop::quit);
t、 启动(30);
loop.exec();
qApp->processEvents();
}
}
有效: 但是,当我手动单击调用相同的自动滚动功能的按钮时,这个问题不会出现
void MainWindow::on_BTN_Load_clicked()
{
QUrl url = QUrl(ui->lineEdit->text());
webview->page()->load(url);
connect(webview->page(), &QWebEnginePage::loadFinished, this, &MainWindow::on_PageLoadFinished);
}
void MainWindow::on_PageLoadFinished()
{
disconnect(webview->page(), &QWebEnginePage::loadFinished, this, &MainWindow::on_PageLoadFinished);
//Get the page's height
webview->page()->runJavaScript("document.body.scrollHeight",[&](const QVariant &result) {set_PageHeight(result.toInt());});
}
void MainWindow::set_PageHeight(int TheHeight)
{
ThePageHeight = TheHeight;
// ScrollDownPage(); //I disable this now
}
void MainWindow::ScrollDownPage()
{
TheCurrentVerticalScroll = 0;
while (TheCurrentVerticalScroll <= ThePageHeight)
{
webview->page()->runJavaScript(QString("window.scrollTo(0, %1);").arg(TheCurrentVerticalScroll));
TheCurrentVerticalScroll += 100;
QEventLoop loop;
QTimer t;
t.connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);
t.start(30);
loop.exec();
qApp->processEvents();
}
}
//I add this:
void MainWindow::on_BTN_Scroll_clicked()
{
ScrollDownPage();
}
void主窗口::在加载时单击()
{
QUrl url=QUrl(ui->lineEdit->text());
webview->page()->加载(url);
连接(webview->page(),&QWebEnginePage::loadFinished,this,&MainWindow::on_PageLoadFinished);
}
void main window::on_PageLoadFinished()
{
断开连接(webview->page(),&QWebEnginePage::loadFinished,this,&MainWindow::on_PageLoadFinished);
//获取页面的高度
webview->page()->runJavaScript(“document.body.scrollHeight”[&](constqvariant&result){set_PageHeight(result.toInt());});
}
void主窗口::设置页面高度(内部高度)
{
页面高度=高度;
//ScrollDownPage();//我现在禁用它
}
void MainWindow::ScrollDownPage()
{
当前垂直滚动=0;
while(当前垂直滚动页面()->运行JavaScript(QString(“window.scrollTo(0,%1);”)).arg(当前垂直滚动));
当前垂直滚动+=100;
QEventLoop循环;
QTimer t;
t、 连接(&t,&QTimer::timeout,&loop,&QEventLoop::quit);
t、 启动(30);
loop.exec();
qApp->processEvents();
}
}
//我补充说:
void主窗口::在\u BTN\u滚动\u单击()时
{
滚动下载页();
}
我想要什么: 我想自动滚动网页,而不是通过单击按钮手动滚动
谢谢。我测试过的代码表明它不起作用,我没有遇到问题,我用Qt 5.9.1在Linux中测试过它,也许错误在别处,你可以共享完整的代码来测试它。@eyllanesc这些是完整的代码。我在Linux mint 18.2下也使用过它。也许你试图加载一个小页面,所以自动滚动t在观察到问题之前快速进入页面末尾(冻结)。@EylanEsc这是一个很大的页面,例如:我尝试了链接,但没有问题。@EylanEsc调用此函数后是否可以直接重新检查发生的情况:ScrollDownPage();
void MainWindow::on_BTN_Load_clicked()
{
QUrl url = QUrl(ui->lineEdit->text());
webview->page()->load(url);
connect(webview->page(), &QWebEnginePage::loadFinished, this, &MainWindow::on_PageLoadFinished);
}
void MainWindow::on_PageLoadFinished()
{
disconnect(webview->page(), &QWebEnginePage::loadFinished, this, &MainWindow::on_PageLoadFinished);
//Get the page's height
webview->page()->runJavaScript("document.body.scrollHeight",[&](const QVariant &result) {set_PageHeight(result.toInt());});
}
void MainWindow::set_PageHeight(int TheHeight)
{
ThePageHeight = TheHeight;
// ScrollDownPage(); //I disable this now
}
void MainWindow::ScrollDownPage()
{
TheCurrentVerticalScroll = 0;
while (TheCurrentVerticalScroll <= ThePageHeight)
{
webview->page()->runJavaScript(QString("window.scrollTo(0, %1);").arg(TheCurrentVerticalScroll));
TheCurrentVerticalScroll += 100;
QEventLoop loop;
QTimer t;
t.connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit);
t.start(30);
loop.exec();
qApp->processEvents();
}
}
//I add this:
void MainWindow::on_BTN_Scroll_clicked()
{
ScrollDownPage();
}