Всем привет.
Очень надеюсь, что кто-нибудь что-то подскажет (а вдруг).
Задавал этот вопрос на форуме по Qt - не повезло...
И так.
Написал свой браузер на Qt для своего же приложения с использованием Flash player-а.
Так вот при вызове JavaScript функции (ExternalInterface.call) из базового (первым загружен)
ролика - все в порядке, а вот если вызывать (к примеру вывод на печать html страницы)
из вложенного ролика (подгруженного в основной) приложение валится с предложением
отправить данные в MS.
Если кто-нибудь что-то по теме знает большая просьба поделиться.
Добавлено через 25 минут
Небольшое дополнение:
после нескольких удачных попыток из базового ролика
тоже валится.
alexcon314
17.01.2013, 01:04
Сложно указать причину, не рассмотрев код приложения. В таком "компоте", как Qt+WebKit+MS можно огрести и не такое.
Я бы проверил версии модулей Qt, FlashPlayer и т.д., опции компиляции на предмет: "а не используем ли мы что-то 32-битное в 64-битном окружении, или наоборот".
Ось: 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
Базовый ролик
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);
}
}
}
Подгружаемый ролик
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);
}
}
}
Впринципе код довольно простой, но проблему пока не решил.
Большая просьба ткнуть носом где ступил.
Короче сам добыл информацию путем экспериментов.
К сожалению QtWebKit плохо оттестирован для компиляции MinGW.
Оптимальным вариантом оказалась только версия Qt4.8 (Qt4.7-не проверял, Qt5.0-тоже проблемы)
при компиляции в VS2010 SP1 - все другие варианты fail.
Для теста можете использовать страничку (http://ifinterface.com/techtest/testprint.html)
Приложение крешится обычно на 3-6 вывод на печать.
Всем успешных трудов.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.