Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   QtWebKit и ExternalInterface (http://www.flasher.ru/forum/showthread.php?t=192610)

ZicoRio 16.01.2013 23:55

QtWebKit и ExternalInterface
 
Всем привет.
Очень надеюсь, что кто-нибудь что-то подскажет (а вдруг).
Задавал этот вопрос на форуме по Qt - не повезло...

И так.
Написал свой браузер на Qt для своего же приложения с использованием Flash player-а.
Так вот при вызове JavaScript функции (ExternalInterface.call) из базового (первым загружен)
ролика - все в порядке, а вот если вызывать (к примеру вывод на печать html страницы)
из вложенного ролика (подгруженного в основной) приложение валится с предложением
отправить данные в MS.

Если кто-нибудь что-то по теме знает большая просьба поделиться.

Добавлено через 25 минут
Небольшое дополнение:
после нескольких удачных попыток из базового ролика
тоже валится.

alexcon314 17.01.2013 01:04

Сложно указать причину, не рассмотрев код приложения. В таком "компоте", как Qt+WebKit+MS можно огрести и не такое.
Я бы проверил версии модулей Qt, FlashPlayer и т.д., опции компиляции на предмет: "а не используем ли мы что-то 32-битное в 64-битном окружении, или наоборот".

ZicoRio 17.01.2013 01:57

Ось: Windows XP x32 Pro SP3.
Qt: 4.8.4
MinGW: 4.4
Пишу в NetBeans 7.2.1.
FlashPlayer: 11.5.502.110 (debug version)

Попробовал - скомпилировал из под VS 2010 (уже под Win7 x32) - походил по yandex-у,
тоже падает в какой-то момент с bbadbeef.
Проблема - не может обратить по адресу в памяти, но вот почему...

Самый-то прикол в том что есть такой браузер QupZilla тоже на Qt.
В нем не падает - все гуд. Исходники его открыты, но я не могу разобраться
что они там такого делают что не падает (слаб еще в C++ видимо).

Попозже соберу упрощенный вариант с данной проблемой - покажу исходники.
Закину на свой сайт странички для теста - может тогда кто-то поможет разобраться.

Но если есть какие мысли, не дожидайтесь - пишите.

Добавлено через 14 часов 11 минут
Со второго, третьего раза вывода на печать падает приложение.

main.cpp

Код:

#include <QApplication>
#include <QLocale>
#include <QTextCodec>
#include <QWebSettings>

#include "TestBrowser.h"

int main(int argc,char *argv[]){
    QApplication a(argc,argv);
    QWebSettings *ws=QWebSettings::globalSettings();
    ws->setAttribute(QWebSettings::PluginsEnabled,true);
    ws->setAttribute(QWebSettings::JavascriptEnabled,true);
    ws->setAttribute(QWebSettings::JavaEnabled,true);
    ws->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);
    ws->setAttribute(QWebSettings::JavascriptCanCloseWindows,true);
    ws->setAttribute(QWebSettings::JavascriptCanAccessClipboard,true);
    ws->setAttribute(QWebSettings::SpatialNavigationEnabled,true);
    ws->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled,true);
    ws->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled,true);
    ws->setAttribute(QWebSettings::LocalStorageEnabled,true);
    ws->setAttribute(QWebSettings::PrintElementBackgrounds,false);
    ws->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);
    QLocale::setDefault(QLocale(QLocale::Russian,QLocale::RussianFederation));
    QTextCodec *utfcodec=QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(utfcodec);
    QTextCodec::setCodecForCStrings(utfcodec);
   
    TestBrowser *mw = new TestBrowser();
    mw->setWindowIcon(QIcon("favicon.ico"));
    mw->resize(1060,800);
    mw->move(40,0);
    mw->show();
   
    return a.exec();
}

TestBrowser.cpp
Код:


#include "TestBrowser.h"

TestBrowser::TestBrowser(){
    tp="http://ifinterface.com/techtest/testprint.html";
    view=new QWebView(this);
    view->page()->setForwardUnsupportedContent(true);
    view->page()->createStandardContextMenu();

    locationEdit=new QLineEdit(this);
    locationEdit->setSizePolicy(QSizePolicy::Expanding,locationEdit->sizePolicy().verticalPolicy());
   
    QToolBar *toolBar=addToolBar("Navigation");
    toolBar->addAction(view->pageAction(QWebPage::Back));
    toolBar->addAction(view->pageAction(QWebPage::Forward));
    toolBar->addAction(view->pageAction(QWebPage::Reload));
    toolBar->addAction(view->pageAction(QWebPage::Stop));
    QPushButton *b1=new QPushButton("to TestPage",this);
    toolBar->addWidget(b1);
    toolBar->addWidget(locationEdit);
    QPushButton *b2=new QPushButton("=>",this);
    toolBar->addWidget(b2);
   
    connect(view->page(),SIGNAL(printRequested(QWebFrame *)),this,SLOT(doPrint(QWebFrame *)));
    connect(b1,SIGNAL(clicked()),this,SLOT(toTestPage()));
    connect(b2,SIGNAL(clicked()),SLOT(changeLocation()));
    connect(locationEdit,SIGNAL(returnPressed()),SLOT(changeLocation()));
   
    locationEdit->setText(tp);
    view->load(QUrl(tp));
   
    setCentralWidget(view);
}

void TestBrowser::doAlertPan(QString me){
    QMessageBox msgBox;
    msgBox.setWindowIcon(QIcon("favicon.ico"));
    msgBox.setIcon(QMessageBox::Information);
    msgBox.setWindowTitle(tr("WebPage :: Сообщение"));
    msgBox.setText(me);
    msgBox.exec();
}

void TestBrowser::toTestPage(){
    locationEdit->setText(tp);
    view->load(QUrl(tp));
    view->setFocus();
}

void TestBrowser::doPrint(QWebFrame * fr){
    QPrintPreviewDialog* dialog=new QPrintPreviewDialog(this);
    dialog->resize(800, 750);
    connect(dialog,SIGNAL(paintRequested(QPrinter*)),fr,SLOT(print(QPrinter*)));
    dialog->exec();
    dialog->deleteLater();
}

void TestBrowser::changeLocation(){
    QUrl url=QUrl(locationEdit->text());
    view->load(url);
    view->setFocus();
}

TestBrowser.h
Код:


#ifndef TESTBROWSER_H
#define        TESTBROWSER_H

#include <QApplication>
#include <QMainWindow>
#include <QObject>
#include <QLineEdit>
#include <QToolBar>
#include <QPushButton>
#include <QMessageBox>
#include <QPrintPreviewDialog>
#include <QPrinter>
#include <QWebView>
#include <QWebFrame>
#include <QUrl>

class TestBrowser : public QMainWindow{
Q_OBJECT
public:
    TestBrowser();
    QString tp;
    QWebView *view;
    QLineEdit *locationEdit;
    void doAlertPan(QString me);

public slots:
    void changeLocation();
    void toTestPage();
    void doPrint(QWebFrame * fr);
       
};

#endif

Базовый ролик
Код AS3:

package{
        import flash.net.URLRequest;
        import MakeButton;
        import flash.display.Sprite;
        import flash.display.SimpleButton;
        import flash.display.Loader;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.IOErrorEvent;
        import flash.external.ExternalInterface;
        import flash.net.URLRequest;
        public class TestPrint extends Sprite{
                public var b1:SimpleButton;
                public var b2:SimpleButton;
                public var b3:SimpleButton;
                public var ob_sys:Object=new Object;
                public var ldr:Loader=new Loader();
                public var pocket:Sprite;
                public function TestPrint():void{
                        if (stage){
                                init();
                        }else{
                                addEventListener(Event.ADDED_TO_STAGE,init);
                        }
                }
                private function init(e:Event=null):void{
                        removeEventListener(Event.ADDED_TO_STAGE,init);
                        ob_sys.OSID=2;
                        b1=MakeButton.Made(this,1,"Base clip: Print 7");
                        b1.x=10;
                        b1.y=10;
                        addChild(b1);
                        b1.addEventListener(MouseEvent.CLICK,onClick1);
                        b2=MakeButton.Made(this,1,"Base clip: Print 12");
                        b2.x=10;
                        b2.y=33;
                        addChild(b2);
                        b2.addEventListener(MouseEvent.CLICK,onClick2);
                        genStart();
                }
                public function onClick1(e:MouseEvent):void{
                        ExternalInterface.call("top.mpath.doPrint",7);
                }
                public function onClick2(e:MouseEvent):void{
                        ExternalInterface.call("top.mpath.doPrint",12);
                }
                private function genStart():void{
                        pocket=new Sprite;
                        pocket.y=60;
                        addChild(pocket);
                        //ldr.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loadErr);
                        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLdrComplete);
                        var req:URLRequest=new URLRequest("http://ifinterface.com/techtest/testprintsubclip.swf");
                        ldr.load(req);
                }
                private function onLdrComplete(e:Event):void{
                        var co:*=ldr.content;
                        co.mroot=this;
                        co.y=65;
                        pocket.addChild(co);
                }
        }
}

Подгружаемый ролик
Код AS3:

package{
        import MakeButton;
        import flash.display.Sprite;
        import flash.display.SimpleButton;
        import flash.events.MouseEvent;
        public class TestPrintSubclip extends Sprite{
                public var b1:SimpleButton;
                public var b2:SimpleButton;
                public var ob_sys:Object=new Object;
                public var mroot:Object;
                public function TestPrintSubclip():void{
                        ob_sys.OSID=2;
                        b1=MakeButton.Made(this,1,"Subclip: Print 7");
                        b1.x=10;
                        b1.y=10;
                        addChild(b1);
                        b1.addEventListener(MouseEvent.CLICK,onClick1);
                        b2=MakeButton.Made(this,1,"Subclip: Print 12");
                        b2.x=10;
                        b2.y=33;
                        addChild(b2);
                        b2.addEventListener(MouseEvent.CLICK,onClick2);
                }
                private function onClick1(e:MouseEvent):void{
                        mroot.onClick1(e);
                }
                private function onClick2(e:MouseEvent):void{
                        mroot.onClick2(e);
                }
        }
 
}

Впринципе код довольно простой, но проблему пока не решил.
Большая просьба ткнуть носом где ступил.

ZicoRio 24.01.2013 17:44

Короче сам добыл информацию путем экспериментов.
К сожалению QtWebKit плохо оттестирован для компиляции MinGW.
Оптимальным вариантом оказалась только версия Qt4.8 (Qt4.7-не проверял, Qt5.0-тоже проблемы)
при компиляции в VS2010 SP1 - все другие варианты fail.

Для теста можете использовать страничку
Приложение крешится обычно на 3-6 вывод на печать.

Всем успешных трудов.


Часовой пояс GMT +4, время: 00:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.