Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ QWebPage::downloadRequested

Автор: k0p4 30.9.2010, 23:42

Доброго временисуток. Подскажите пожалуйста, как правильнопользоваться.
В коде :

 connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
            d,SLOT(downloadRequested(QNetworkRequest)));

...

void WebBrowser::downloadRequested(QNetworkRequest *request)
{
    QUrl url = request->url();
    QMessageBox msgBox;
    msgBox.setText("ROBIT");
    msgBox.exec();
    emit downLoadRequested(url);
}

работать отказывается. Похоже, я что-то упускаю. Как LinkDelegationPolicy, в сигнале linkClicked();


Извиняюсь, неправильнокод вставил...
 connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
            this,SLOT(downloadRequested(QNetworkRequest)));
    connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));


...

Автор: Алексей1153 1.10.2010, 6:41

1) а где находится и каким типом является переменная d ?
2) где вызывается код

Цитата(k0p4 @ 1.10.2010, 2:42) *
connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
this,SLOT(downloadRequested(QNetworkRequest)));
connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));

?

Автор: k0p4 1.10.2010, 13:18

Цитата(Алексей1153 @ 1.10.2010, 6:41) *
1) а где находится и каким типом является переменная d ?
2) где вызывается код
Цитата(k0p4 @ 1.10.2010, 2:42) *
connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
this,SLOT(downloadRequested(QNetworkRequest)));
connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));

?


 d = new downLoadDialog;
.....
d->show();
.....
class downLoadDialog : public QDialog
{
    Q_OBJECT
public:
....
public slots:
    void connectItem(QUrl link);
signals:
    void recived(QUrl url);
};


Автор: Алексей1153 1.10.2010, 13:31

ну, справка говорит, что сигнал определён так

void QWebPage::downloadRequested ( const QNetworkRequest & request ) // [signal]

а ты указываешь
SIGNAL(downloadRequested(QNetworkRequest)

Затем,

Цитата
connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
d,SLOT(downloadRequested(QNetworkRequest)));

почему в SLOT указан сигнал ?


Автор: k0p4 1.10.2010, 23:01

Цитата(Алексей1153 @ 1.10.2010, 13:31) *
ну, справка говорит, что сигнал определён так

void QWebPage::downloadRequested ( const QNetworkRequest & request ) // [signal]

а ты указываешь
SIGNAL(downloadRequested(QNetworkRequest)

Затем,
Цитата
connect(ui->webView->page(),SIGNAL(downloadRequested(QNetworkRequest)),
d,SLOT(downloadRequested(QNetworkRequest)));

почему в SLOT указан сигнал ?


Эмм ну вообще-то это не сигнал а слот. И это слот обьекта downLoadDialog.

Автор: kwisp 2.10.2010, 10:06

Цитата(k0p4 @ 1.10.2010, 0:42) *
connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));

в сигнале указатель на QUrl а в слоте QUrl.
Естественно это не сработает.

П.С.
и все же называй сигналы и слоты разными именами, а тов едь так запутаться не сложно.
Это я про downloadRequested(QNetworkRequest)

Автор: k0p4 2.10.2010, 23:17

Цитата(kwisp @ 2.10.2010, 10:06) *
Цитата(k0p4 @ 1.10.2010, 0:42) *
connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));

в сигнале указатель на QUrl а в слоте QUrl.
Естественно это не сработает.

П.С.
и все же называй сигналы и слоты разными именами, а тов едь так запутаться не сложно.
Это я про downloadRequested(QNetworkRequest)


при
connect(this,SIGNAL(downLoad(QUrl*)),d,SLOT(connectItem(QUrl)));
компилятор выдаёт ошибку о том, что невозможно приведение типов QUrl* и QUrl. Это был отладочный варианткода, когда я думал, что неправильно написал слоты. В моём срр файле таких недочётов нет. Всё компилится. Поэтому вопрос я спрашиваю не "почему не работает код", а как правильно использовать. Как я писал выше, слот просто не выполняется.

Автор: kwisp 3.10.2010, 18:44

тогда больше кода покажи а то гадать можно долго.

Автор: k0p4 5.10.2010, 20:33

Цитата(kwisp @ 3.10.2010, 18:44) *
тогда больше кода покажи а то гадать можно долго.



downloaditem.cpp

void downLoadItem::init(QNetworkRequest request)
{
    Manager = new QNetworkAccessManager;

    QNetworkReply *reply = Manager->get(request);    
  
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
               this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));    

    file.setFileName(getFileName(reply->url()));
    file.open(QIODevice::WriteOnly);
}


void downLoadItem::slotError(QNetworkReply::NetworkError)
{

}
void downLoadItem::slotFinished()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    file.close();
    reply->deleteLater();
}
void downLoadItem::slotReadyRead()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
    file.write(reply->readAll());
}


downloaddialog.cpp

void downLoadDialog::connectItem(QNetworkRequest request)// этот слот не робит.
{
    item->init(request);

    QMessageBox msgBox;
    msgBox.setText("ROBIT");
    msgBox.exec();
}


webview.cpp

XronView::XronView(): QWebView()
{
    d = new downLoadDialog;

    this->page()->setForwardUnsupportedContent(true);

    connect(this->page(),SIGNAL(downloadRequested(QNetworkRequest)),
            d,SLOT(connectItem(QNetworkRequest)));

     d->show();

     this->load(QUrl("http://www.upload.com.ua"));
}


Автор: igor_bogomolov 5.10.2010, 20:48

void downLoadDialog::connectItem(const QNetworkRequest &request)

Автор: k0p4 5.10.2010, 21:23

Цитата(igor_bogomolov @ 5.10.2010, 20:48) *
void downLoadDialog::connectItem(const QNetworkRequest &request)

исправил. Проблема осталась.Так же отладочный слот

 connect(this->page(),SIGNAL(downloadRequested(QNetworkRequest)),
            this,SLOT(down(QNetworkRequest)));

void XronView::down(QNetworkRequest &req)
{

    QMessageBox msgBox;
    msgBox.setText("ROBIT");
    msgBox.exec();

}


не робит. Значит не проходит сигнал...

Автор: igor_bogomolov 5.10.2010, 21:36

const опять пропустил

Автор: k0p4 5.10.2010, 21:51

Цитата(igor_bogomolov @ 5.10.2010, 21:36) *
const опять пропустил


Вы имеете ввиду
    connect(this->page(),SIGNAL(downloadRequested(const QNetworkRequest &)),
            this,SLOT(down(const QNetworkRequest &)));

void XronView::down(const QNetworkRequest & req)
{

    QMessageBox msgBox;
    msgBox.setText("ROBIT");
    msgBox.exec();

}

? Так тоже не реагирует. Если можно подробней обьясните.

Автор: igor_bogomolov 5.10.2010, 22:20

Я имел в виду функцию down, в connect можно было ничего не менять (оба варианта правильны).
Почему у тебя не работает не знаю. Посмотри вот этот пример (http://www.linuxjournal.com/magazine/using-webkit-your-desktop-application?page=0,0), там, на сколько я понимаю, делается примерно то же самое, что пытаешься сделать ты

Автор: kwisp 6.10.2010, 9:30

k0p4,
если не разобрался - заголовочные файлы давай тоже сюда выкладывай.
получив в
void downLoadDialog::connectItem(const QNetworkRequest& request)
request
ты не сможешь вызвать в ней
init(request)
т.к. фактически-передаваемый аргумент константный.

из ассистената

Цитата
void QWebPage::downloadRequested ( const QNetworkRequest & request ) [signal]
This signal is emitted when the user decides to download a link. The url of the link as well as additional meta-information is contained in request.
See also unsupportedContent().

не оч.силен в английском "download a link" означает ли это что при простой загрузке странички он будет вызываться?

как на счет unsupportedContent()? может срабатывает он?
как на счет других сигналов
Цитата
void loadFinished ( bool ok )
void loadProgress ( int progress )
void loadStarted ()


П.С.
Manager = new QNetworkAccessManager;
а где освобождаешь память?

Автор: k0p4 9.10.2010, 16:05

Цитата
void downLoadDialog::connectItem(const QNetworkRequest& request)
request
ты не сможешь вызвать в ней
init(request)
т.к. фактически-передаваемый аргумент константный.

Не понял.


Цитата
не оч.силен в английском "download a link" означает ли это что при простой загрузке странички он будет вызываться?

нет. Грубо говоря, сигнал посылаеться, когда пользователь желает загрузить линк. Насколько я понимаю - кликает по прямому линку, либо идёт редирект на прямой линк.

Цитата
как на счет unsupportedContent()? может срабатывает он?

выставил с самого начала.

this->page()->setForwardUnsupportedContent(true);


Цитата
Manager = new QNetworkAccessManager;
а где освобождаешь память?

в downloaditem.h

  QNetworkAccessManager *Manager;



http://paste.org/pastebin/view/23339


Автор: Алексей1153 9.10.2010, 17:11

Цитата(k0p4 @ 9.10.2010, 19:05) *
в downloaditem.h

QNetworkAccessManager *Manager;

это объявление указателя, а не освобождение памяти ) Сделай в деструкторе класса
delete Manager;

Автор: kwisp 9.10.2010, 23:18

Цитата(Алексей1153 @ 9.10.2010, 18:11) *
это объявление указателя, а не освобождение памяти ) Сделай в деструкторе класса
delete Manager;

или назначь хозяина обЪекту менеджера

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

Автор: k0p4 10.10.2010, 1:36

Решил пол проблемы. Сигнал посылаеться, когда пользователь вконтекстном меню кликает save link... Но. На, к примеру, большинстве обменниках установлены кнопочки, и ссылки не прямые (должен быть редирект, к примеру http://gameinside.ua/getfile.php?area=demos&id=7782 - ссылка возвращаемая copy link). Собственно мэнэджер качает файл download.php. Отсуда вопрос, как поймать редирект?

Автор: kwisp 10.10.2010, 12:43

Цитата(kwisp @ 6.10.2010, 10:30) *
не оч.силен в английском "download a link" означает ли это что при простой загрузке странички он будет вызываться?
Цитата(k0p4 @ 10.10.2010, 2:36) *
Сигнал посылаеться, когда пользователь вконтекстном меню кликает save link...

кхммм...
что и требовалось доказать.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)