crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как отправить дополнительные данные слоту?
smackthat
  опции профиля:
сообщение 18.4.2010, 22:10
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.10.2009
Пользователь №: 1163

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день. У меня один и тот же сигнал (QWebFrame::loadFinished) отправляется с разных функций и мне нужно, чтобы при обработке этого сигнала передавались дополнительные данные. Как это можно организовать?

Тоесть допустим я загружаю одну страничку и после загрузки обрабатываю одним способом, другую страничку другим. Как можно указать сигналу каким образом обрабатывать? Как передать в сигнал аргумент?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.4.2010, 22:33
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(smackthat @ 19.4.2010, 2:10) *
Как передать в сигнал аргумент?
сигнал имеет заранее определённую структуру и аргумент помещает отправитель сигнала.
Как и любая функция, у которой заранее определено кол-во аргументов, так и у сигнала, на ходу ничего поменять нельзя
Можно попробовать, если структура программы позволяет, сделать промежуточный (дополнительный) слот и сигнал.
Первый сигнал прийдёт в промежуточный слот, а он уже пошлёт дополнительный сигнал (самописаный), с неким дополнительным параметром.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smackthat
  опции профиля:
сообщение 19.4.2010, 12:39
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.10.2009
Пользователь №: 1163

Спасибо сказали: 0 раз(а)




Репутация:   0  


Попробую с другого конца пояснить свою проблему: я хочу написать программу, которая делает примерно следующее:
for(int counter=0;counter<10;counter++)
{
     //  
     // загружаю страничку http://website.com/page/counter/
     // тоесть если counter==3, то загружаю http://website.com/page/3/
     // с этой странички я достаю ключевые слова и загоняю их в массив keywords
     // теперь для каждого ключевого слова я ищу странички
     for(int c=0; c<keywords.size(); c++)
    {
           // загружаю страничку http://google.com/search/query=keywords[c]
           // например: http://google.com/search/query=авто
           // достаю, то что мне нужно и перехожу к следующему ключевому слову
    }
}

Проблема тут заключается в том, что загрузка страничек происходит паралельно: тоесть покопаться в уже загруженной страничке я могу только по сигналу loadFinished. Но как сигнал может знать, что делать в загруженной страничке (ведь это может быть или http://website.com/page/3/ или http://google.com/search/query=авто). Поэтому я и хочу как-то передать дополнительную информацию, чтобы обработчик сигнала знал, что делать.

Помоему в этом случае самописный сигнал не подходит (насколько я понял). Помогите решить эту задачу, уже 3й день мучаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 19.4.2010, 12:46
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Юрий тебе уже написал, что проще всего самописный сигнал, который идет от слота, принимающего loadFinished. Почему же так нельзя?
Пример :

Раскрывающийся текст
#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QString>

namespace Ui {
    class Widget;
}

class Widget : public QWidget {
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;

private slots :

void prepareData(int Value);
void setupLabel(int val, QString str);

signals :
        void valueChanged_(int val,QString str);
};

#endif // WIDGET_H


Раскрывающийся текст
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->dial,SIGNAL(valueChanged(int)),this,SLOT(prepareData(int)));
    connect(this,SIGNAL(valueChanged_(int,QString)),this,SLOT(setupLabel(int,QString)));
}

Widget::~Widget()
{
    delete ui;
}


void Widget::prepareData(int Value)
{
    if (Value < 50)
        emit this->valueChanged_(Value,"Less than 50");
       else if (Value >50)
           emit this->valueChanged_(Value,"Greater than 50");
}

void Widget::setupLabel(int val, QString str)
{
    ui->label->setText(QString::number(val)+" is "+ str);
}


Сообщение отредактировал Andrewshkovskii - 19.4.2010, 13:17
Прикрепленные файлы
Прикрепленный файл  smackthatExample.zip ( 8,75 килобайт ) Кол-во скачиваний: 86
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 19.4.2010, 13:14
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


smackthat,
можно воспользоваться QObject::sender() в слоте обработчике абсолютно всех сигналов QWebFrame::loadFinished(), полученный указатель на QObject приводить с помощью qobject_cast<>() к указателю на QWebFrame, вытаскивать с помощью QWebFrame::url().toString() тукущую страничку, получается последнююю загруженную, и в соовтетсвии с полученным результатом действовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 19.4.2010, 13:18
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Мне кажется он не может разобраться, как передать данные сигнала+ какие-то свои данные, и насколько я понял, ему не хочется смотреть содержимое страницы в этом случае, а лишь по условию её обрабатывать. Может я не так понимаю - поправьте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smackthat
  опции профиля:
сообщение 19.4.2010, 14:03
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.10.2009
Пользователь №: 1163

Спасибо сказали: 0 раз(а)




Репутация:   0  


2 kwisp
я тут нашел такую штуку: все объекты наследуются от QObject, в котором можно задать свои параметры через setProperty() и потом их достать через property(). А доступ к property через QObject::sender(). Похоже это, то что я искал. Теперь для каждого созданного QWebFrame буду задавать параметры, которые укажут как обрабатывать сигнал loadFinished.

Цитата
Мне кажется он не может разобраться, как передать данные сигнала+ какие-то свои данные

да именно, но сам сигнал loadFinished не несет с собой никаких данных или нет?



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 19.4.2010, 14:17
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


smackthat,
немного не пойму.
в соответсвии с чем ты будешь формировать данные, которые поместишь с помощью setProperty() в объект класса наследника QObject?
если в сооветвествии с адресом загружаемой страничкой то эта лишняя работа. через url() все можно получить без property().
тебе ведь надо знать на какой страничке находится объект QWebFrame в момент прихода loadFinished от этого объекта? так ведь?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smackthat
  опции профиля:
сообщение 19.4.2010, 15:06
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 18.10.2009
Пользователь №: 1163

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 19.4.2010, 14:17) *
smackthat,
немного не пойму.
в соответсвии с чем ты будешь формировать данные, которые поместишь с помощью setProperty() в объект класса наследника QObject?
если в сооветвествии с адресом загружаемой страничкой то эта лишняя работа. через url() все можно получить без property().
тебе ведь надо знать на какой страничке находится объект QWebFrame в момент прихода loadFinished от этого объекта? так ведь?

я хочу хранить в property() режим обработки. Например: GET_TITLE (не <title></title>), GET_KEYWORDS и так далее. Можно впринципе обойтись и url, но так будет удобнее. И ты не подскажешь как привести указатель к типу QWebFrame с использованием qobject_cast<>? Так чтоли QObject::sender(qobject_cast<QWebFrame>*)->url() ?

пытаюсь достать url странички из обработчика сигнала loadFinished:
QString url=(qobject_cast<QWebFrame *>(QObject::sender()))->url().toString();

Компилится нормально, но когда доходит до выполнения этой строки программа вылетает. В чем ошибка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.4.2010, 15:13
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Делай почастям, не заблудишся:
QObject *obj = QObject::sender();
QWebFrame *frame = qobject_cast<QWebFrame *>(obj);
QString url = frame->url().toString();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 21:59