Russian Qt Forum
Ноябрь 25, 2024, 16:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Грешу на QtWebKit, просьба помочь  (Прочитано 13374 раз)
ZicoRio
Гость
« : Январь 11, 2013, 02:39 »

Всем привет.
Ось: Windows XP x32 Pro SP3.
Qt: 4.8.4
MinGW: 4.4
Пишу в NetBeans 7.2.1.

Коротенько так:
пишу свой браузер для своего же веб-приложения где функциональный интерфейс на Flash.
Приложение состоит из QToolBar-а с кнопками Back, Forward, Reload и Stop.
Также на нем QLineEdit для ввода адреса. Также QWebView как setCentralWidget. Это все что есть.

Загружаю страницу в QWebView.
На странице находятся 2 iframe верхний (с интерфейсом на Flash - кнопки разные всякие),
во втором 10 вложенных iframe (один над другим для отображения разного рода информации,
но отображается только один из вложенных).

Вложенные iframe -ы (10 штук) формируются не сразу, а только в определенный момент.
Так вот когда их еще нет я без проблем нажимаю Reload, выходит окно подтверждения,
чтобы покинуть страницу (сделано на JavaScript), подтверждаю и происходит перезагрузка
страницы - все ОК.
А вот когда iframe -ы (10 штук) сформированы, кстати сказать они формируются после сигнала
из FlashPlayer-a (ExternalInterface.call - вызывается JavaScript функция) после подтверждения перезагрузки
приложение крешится (с предложением отослать данные в MS).
Так же оно крешится если вызвать из Flash вывод на печать (именно когда окно вылезает для выбора принтера).

Запустил дебаггер, говорит - Получен сигнал: SIGSEGV (Segmentation fault)
и в самом последнем стеке вызовов - Cannot access memory at address 0x0
также где-то в середине списка вызовов - Cannot access memory at address 0xbaadf00d

В обычных браузерах все отлично работает!

Внимание вопрос:
как окончательно убедиться, что это такое, моя ошибка или таки баг QtWebKit-а???
Голова моя пополам уже, большая просьба помочь!
Записан
carrygun
Гость
« Ответ #1 : Январь 11, 2013, 05:19 »

Извиняюсь за оффтоп, но "Cannot access memory at address 0xbaadf00d" убило  Смеющийся
Записан
ZicoRio
Гость
« Ответ #2 : Январь 11, 2013, 06:08 »

Ну чем конкретно убило-то?
Поделились лучше бы.
Нужна любая информация.
Записан
Bepec
Гость
« Ответ #3 : Январь 11, 2013, 06:54 »

bad - плохо Веселый baad - очень плохо с выражением Веселый

У вас ошибка в вашем коде, % на 95.

Видимо идёт где то обращение по несуществующему указателю.

Смотрите код, локализуйте место ошибки, исправляйте код, наслаждайтесь жизнью.
Записан
carrygun
Гость
« Ответ #4 : Январь 11, 2013, 10:09 »

А f00d это food (еда). Вроде бы это как одна из стандартных ошибок gcc, когда программа лезет кудато не туда в память. Чтото в духе stack protector'а.
Как уже говорили скорее всего чтото в коде у тебя.
Записан
ZicoRio
Гость
« Ответ #5 : Январь 11, 2013, 13:15 »

Если это моя ошибка , я буду только счастлив.
Посмотрите, пожалуйста, мои исходники,
там некоторые кнопки без слотов, это я
старался облегчить код:

main.cpp
Код:
#include "mainwindow.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QLocale::setDefault(QLocale(QLocale::Russian,QLocale::RussianFederation));
    QTextCodec *utfcodec=QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(utfcodec);
    QTextCodec::setCodecForCStrings(utfcodec);
    
    MainWindow *browser = new MainWindow();
    browser->setWindowIcon(QIcon("favicon.ico"));
    browser->resize(1060,800);
    browser->move(40,0);
    browser->show();
    return app.exec();
}

mainwindow.h
Код:
#ifndef       MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QWebView>
#include <QWebFrame>

class netAccessManager: public QNetworkAccessManager{
    public:
    QNetworkReply * createRequest(Operation op,const QNetworkRequest & req,QIODevice * outgoingData){
        QNetworkRequest myReq(req);
        myReq.setRawHeader("User-Agent","MyBrowser QtWebKit/4.8.4");
        return QNetworkAccessManager::createRequest(op,myReq,outgoingData);
    }
};

class MainWindow : public QMainWindow{
    Q_OBJECT
    public:
        MainWindow();
        netAccessManager *netman;
        QWebView *view;
        QLineEdit *locationEdit;
        
        void doAlertPan(QString me);
        
    public slots:
        void sslErrorHandler(QNetworkReply* qnr, const QList<QSslError> & errlist);
        void changeLocation();
        void tomysite();
        void doPrint(QWebFrame * fr);
        
};

#endif


mainwindow.cpp
Код:
#include "mainwindow.h"

MainWindow::MainWindow(){
    view=new QWebView(this);
    netman=new netAccessManager();
    view->page()->setNetworkAccessManager(netman);
    view->page()->settings()->setAttribute(QWebSettings::PluginsEnabled,true);
    view->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);
    view->page()->settings()->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);
    view->page()->settings()->setAttribute(QWebSettings::LocalStorageEnabled,true);
    view->page()->settings()->setAttribute(QWebSettings::PrintElementBackgrounds,false);
    view->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);
    view->page()->setForwardUnsupportedContent(true);
    view->page()->createStandardContextMenu();
    
    locationEdit = new QLineEdit(this);
    locationEdit->setSizePolicy(QSizePolicy::Expanding,locationEdit->sizePolicy().verticalPolicy());
    
    QToolBar *toolBar = addToolBar(tr("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("My site",this);
    toolBar->addWidget(b1);
    toolBar->addWidget(locationEdit);
    QPushButton *b2=new QPushButton("=>",this);
    toolBar->addWidget(b2);
    
    connect(view->page()->networkAccessManager(),SIGNAL(sslErrors(QNetworkReply*,const QList<QSslError> & )),
            this,SLOT(sslErrorHandler(QNetworkReply*,const QList<QSslError> & )));
    connect(view->page(),SIGNAL(printRequested(QWebFrame *)),this,SLOT(doPrint(QWebFrame *)));
    connect(b1,SIGNAL(clicked()),this,SLOT(tomyprog()));
    connect(b2,SIGNAL(clicked()),SLOT(changeLocation()));
    
    QString addr="http://mysite.ru";
    locationEdit->setText(addr);
    QUrl url = QUrl(addr);
    view->load(QUrl(url));

    setCentralWidget(view);
}

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

void MainWindow::tomysite(){
    QString addr="https://mysite.ru";
    locationEdit->setText(addr);
    QUrl url = QUrl(addr);
    view->load(url);
    view->setFocus();
}

void MainWindow::sslErrorHandler(QNetworkReply* qnr,const QList<QSslError> & errlist){
       qnr->ignoreSslErrors();
}

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

void MainWindow::doPrint(QWebFrame * fr){
    QPrinter *printer=new QPrinter();
    printer->setOrientation(QPrinter::Portrait);
    printer->setPaperSize(QPrinter::A4);
    QPrintDialog *dialog=new QPrintDialog(printer);
    if (dialog->exec()==QDialog::Accepted){
    fr->print(printer);
    }
}
« Последнее редактирование: Январь 11, 2013, 13:17 от ZicoRio » Записан
Bepec
Гость
« Ответ #6 : Январь 11, 2013, 13:19 »

Будет в сотни, нет, в ТЫСЯЧИ раз лучше, если вы запакуете свой проект в архив и приложите к сообщению Улыбающийся

PS Ответ-> Дополнительные опции-> Вложение.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Январь 11, 2013, 13:20 »

Ты бы лучше сделал минимальный компилябельный пример, воспроизводящий ошибку. Быстрее помощь получишь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ZicoRio
Гость
« Ответ #8 : Январь 11, 2013, 13:28 »

Исходники выложил практически без правки, просто удалил локальные URL адреса.
По поводу ошибки в том-то и дело я не могу отловить ее именно в своем коде.
Большая просьба просмотреть мои исходники (они весьма небольшие - всего 3 файлика)
и сказать где я наврал (если наврал).
Записан
Bepec
Гость
« Ответ #9 : Январь 11, 2013, 13:32 »

Посмотрел - всё работает.

В чем ошибка - хз. Где падает - хз. Когда падает - хз. На чём падает - хз.

PS вы конечно молодец, но проект без воспроизведения ошибки по ценности равен дырке от бублика.
Записан
ZicoRio
Гость
« Ответ #10 : Январь 11, 2013, 13:40 »

Дык в том-то и печаль, что ошибка похоже не моя (название темы).
На обычных сайтах все работает, падает именно на моем веб приложении с FlashPlayer-ом
и запусками JavaScript из него.
А по поводу выложить весь проект, это вы имеете ввиду все файлы проекта NetBeans?
Записан
Bepec
Гость
« Ответ #11 : Январь 11, 2013, 13:43 »

Падает из-за ТВОЕГО приложения. Из-за ТВОЕГО проекта. Из-за ТВОИХ ошибок в твоём проекте.

Qt браузер работает стабильно. В его основе, не дай бог ошибиться, скрывается сафари.

Как мы можем помочь ТЕБЕ найти ошибку в ТВОЁМ не Qt проекте, из-за которого у тебя вылетает ошибка?

PS играем в параноиков экстрасенсов.
Записан
ZicoRio
Гость
« Ответ #12 : Январь 11, 2013, 13:48 »

Не понял выражение [не Qt проекте] - всмысле?
Хорошо, если вы так уверены, что ошибка в моих трех файликах с кодом,
то что конкретно мне делать, куда дальше-то смотреть?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Январь 11, 2013, 14:03 »

Чтобы понять, где у тебя ошибка, нужно ее воспроизвести, а для этого нужно твое вэб-приложение. 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ZicoRio
Гость
« Ответ #14 : Январь 11, 2013, 22:13 »

Мое приложение доступно пока только локально.
Хотя при компиляции ошибок никаких, может ли быть
ошибка в связке NetBeans + Qt + MinGW ?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 23.