• 12279阅读
  • 17回复

[讨论]webkit 怎样在新窗口打开链接 [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2011-12-16
做个最简单的浏览器 使用webkit 一切正常 就是不能在新窗口打开链接 求大神帮助
源码:
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtWebKit/QtWebKit>
#include <QtGui/QHBoxLayout>
#include <QtCore/QTextCodec>
int main(int argc, char *argv[])
{        
QApplication app(argc, argv);
      // QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
        QTextCodec *codec = QTextCodec::codecForName("system");
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
        QWidget *window = new QWidget;
        //window->QWidget::setWindowFlags(Qt::Sheet);
        window->setWindowTitle(QObject::tr("系统"));
        QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true);
        QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,true);
        QWebView *view = new QWebView;
        view->load(QUrl(http://192.168.155.1/dbzz));
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(view);
        window->setLayout(layout);
        window->setMinimumSize(1024,600);
        window->setMaximumSize(1024,768);
        window->show();
        return app.exec();
}
离线cthawdf

只看该作者 1楼 发表于: 2011-12-16

view ->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
connect(view , SIGNAL(linkClicked(const QUrl&)), this, SLOT(slotOpenADsUrl(const QUrl&)));

只看该作者 2楼 发表于: 2011-12-18
直接添加报错 this 是错误应用 connect未声明 应该怎么添加呢 ? 谢谢
离线roywillow

只看该作者 3楼 发表于: 2011-12-18
回 2楼(草拟大爷阿) 的帖子
1楼的意思是那个槽是this中的一个自定义槽吧
也就是说,点击某个链接,之后会发出信号,然后你接受这个信号并进行接下来的处理
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
只看该作者 4楼 发表于: 2011-12-19
那我每个需要打开新窗口的链接都要定义槽?新手很菜 能不能直接给能用的代码我学习下啊,我的全部代码都在上面 谢谢
离线cthawdf

只看该作者 5楼 发表于: 2011-12-19

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QUrl>
#include <QWebView>
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QWebView *view;
private slots:
   void slotOpenUrl(const QUrl&);
};
#endif // WIDGET_H


#include "widget.h"
#include <QtGui/QWidget>
#include <QtWebKit/QtWebKit>
#include <QtGui/QHBoxLayout>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setWindowFlags(Qt::Sheet);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled,true);
    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled,true);
    view = new QWebView(this);

    view->load(QUrl("http://www.baidu.com"));
    view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
    connect(view,SIGNAL(linkClicked(QUrl)),this,SLOT(slotOpenUrl(QUrl)));
    QHBoxLayout *layout =new QHBoxLayout(this);
           layout->addWidget(view);
    setLayout(layout);
     setMinimumSize(1024,600);
     setMaximumSize(1024,768);

}
Widget::~Widget()
{
}
void Widget::slotOpenUrl(const QUrl &url)
{
    view->load(url);
    qDebug()<<"test";
}


#include <QtGui/QApplication>
#include "widget.h"
#include <QtCore/QTextCodec>int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec *codec = QTextCodec::codecForName("system");
           QTextCodec::setCodecForLocale(codec);
           QTextCodec::setCodecForCStrings(codec);
           QTextCodec::setCodecForTr(codec);
    Widget w;
    w.show();
    return a.exec();
}
只看该作者 6楼 发表于: 2011-12-19
回 5楼(cthawdf) 的帖子
谢谢谢谢 您真是太有爱啦 让我充分感受到社会和谐温暖 好好研究下啦
离线roywillow

只看该作者 7楼 发表于: 2011-12-19
5楼的代码看上去似乎还是在原来的view上显示那个url?

并不是什么每个新窗口都要定义槽
槽是在类的声明和实现中定义和实现的,不是啥可以随时创建随时丢掉的
所以,难道你会给你的每个页面都定义一个类……?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
只看该作者 8楼 发表于: 2011-12-20
555...调了一晚上没调通,奋斗!!!
离线cthawdf

只看该作者 9楼 发表于: 2011-12-20
回 7楼(roywillow) 的帖子
QWidget *w= new QWidget;
    QWebView *view1 = new QWebView(w);
    view1->load(url);
    w->show();   重新实现一下槽函数 ,这样有二次链接改变的话就会新建窗口显示网页
离线roywillow

只看该作者 10楼 发表于: 2011-12-20
我有一种思路
就是直接继承一个QObject,和实际浏览页面的窗口
object接受浏览窗口的信号,并决定是否要再创建一个窗口来浏览页面
所有窗口的parent都是那个object
也就是说,利用一个非可视类来进行管理
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线XChinux

只看该作者 11楼 发表于: 2011-12-20
看看QWebView、QWebPage、QWebFrame这些类的protected方法,里面应该有许多有用的东西(有创建窗口的)
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
只看该作者 12楼 发表于: 2011-12-22
嗯呢 加油看看 底子太差 进步太慢了 郁闷
10楼能在我的代码上写出来看看吗?
离线roywillow

只看该作者 13楼 发表于: 2011-12-22
回 12楼(草拟大爷阿) 的帖子
再等20多天我期末考完试吧……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
只看该作者 14楼 发表于: 2011-12-23
回 13楼(roywillow) 的帖子
好吧 好吧 好好考试哦
离线princeholy
只看该作者 15楼 发表于: 2011-12-27
我解决了 你联系我吧 我给你例子
只看该作者 16楼 发表于: 2011-12-28
回 15楼(princeholy) 的帖子
好的 谢谢
离线roywillow

只看该作者 17楼 发表于: 2012-01-22
似乎迟了,但是还是手痒实现了自己的想法

windowmanager.h
  1. #ifndef WINDOWMANAGER_H
  2. #define WINDOWMANAGER_H
  3. #include <QObject>
  4. #include <QUrl>
  5. class WindowManager : public QObject
  6. {
  7.     Q_OBJECT
  8. public:
  9.     explicit WindowManager(QObject *parent = 0);
  10. private slots:
  11.     void createNewWindow(const QUrl url = QUrl());  
  12. };
  13. #endif // WINDOWMANAGER_H


windowmanager.cpp
  1. #include <QWebView>
  2. #include "windowmanager.h"
  3. WindowManager::WindowManager(QObject *parent) :
  4.     QObject(parent)
  5. {
  6.     createNewWindow(QUrl("http://www.qtcn.org"));
  7. }
  8. void WindowManager::createNewWindow(const QUrl url)
  9. {
  10.     QWebView *newView = new QWebView;
  11.     newView->setAttribute(Qt::WA_DeleteOnClose);
  12.     newView->setUrl(url);
  13.     newView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
  14.     connect(newView, SIGNAL(linkClicked(QUrl)), this, SLOT(createNewWindow(QUrl)));
  15.     newView->show();
  16. }


main.cpp
  1. #include <QApplication>
  2. #include "windowmanager.h"
  3. int main(int argc, char *argv[])
  4. {
  5.     QApplication a(argc, argv);
  6.     WindowManager m;
  7.     
  8.     return a.exec();
  9. }


再仔细想想,似乎只要继承一下QWebView也能解决……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个