在使用QWebView类时,如果想打开网页中的链接,我们要这样做!
我们可以使用网页的QwebPage类中的linkClicked(QUrl)来做信号,当我们触发这个信号时,我们就可以让它在一个新的窗口中打开这个链接,但是我们在查看linkClicked()信号时,会发现有这样一句话:
By default no links are delegated and are handled by QWebPage instead.
默认情况下没有链接下放而不是由QWebPage处理。
所以,我们要对它进行一下设置,那我们就要进下步看一下 linkDelegationPolicy
void |
setLinkDelegationPolicy ( LinkDelegationPolicy policy ) |
我们会发现有这样一个函数,可以调用它来设置这个模式,看到这里,我们还不行我们会发现还有一个东西我们不知道,那就是LinkDelegationPolicy,那我们就要进一步看一下它是做什么的了。
enum QWebPage::LinkDelegationPolicy
This enum defines the delegation policies a webpage can have when activating links and emitting the linkClicked() signal.
Constant |
Value |
Description |
QWebPage::DontDelegateLinks |
0 |
No links are delegated. Instead, QWebPage tries to handle them all. |
QWebPage::DelegateExternalLinks |
1 |
When activating links that point to documents not stored on the local filesystem or an equivalent - such as the Qt resource system - thenlinkClicked() is emitted. |
QWebPage::DelegateAllLinks |
2 |
Whenever a link is activated the linkClicked() signal is emitted. |
我们会发现它是一个枚举类型的,它的默认值应该就是0,所以我们在调用linkClicked()不会触发的原因就在这里,选择那种模式就要看我们的实际情况了!
部分代码如下:
信号和槽的链接:
QObject::connect(ui->webView,SIGNAL(linkClicked(QUrl)),this,SLOT(openUrlSlot(QUrl)));
这样做可以避免打开多个窗口的问题,否则出现这个程序点据了整个任务栏。
QObject::connect(ui->webView,SIGNAL(linkClicked(QUrl)),this,SLOT(newWindowSlot(QUrl)));
这样做就可会出现上面我说的情况,尽量避免使用这种方法。
newWindowSlot()的实现:
void MainWindow::newWindowSlot(QUrl url)
{
MainWindow *other =new MainWindow;
other->ui->webView->load(url);
other->show();
}