Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.01.2013, 23:55
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 1  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
По умолчанию QtWebKit и ExternalInterface

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

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

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

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

Старый 17.01.2013, 01:04
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Сложно указать причину, не рассмотрев код приложения. В таком "компоте", как Qt+WebKit+MS можно огрести и не такое.
Я бы проверил версии модулей Qt, FlashPlayer и т.д., опции компиляции на предмет: "а не используем ли мы что-то 32-битное в 64-битном окружении, или наоборот".

Старый 17.01.2013, 01:57
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 3  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

Регистрация: Apr 2012
Адрес: ifinterface.com
Сообщений: 158
Ось: 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);
		}
	}
 
}
Впринципе код довольно простой, но проблему пока не решил.
Большая просьба ткнуть носом где ступил.

Старый 24.01.2013, 17:44
ZicoRio вне форума Посмотреть профиль Отправить личное сообщение для ZicoRio Найти все сообщения от ZicoRio
  № 4  
Ответить с цитированием
ZicoRio
[+5 18.06.13]
[+1 20.07.13]

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

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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