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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QWebView  (Прочитано 9947 раз)
Kauc
Гость
« : Апрель 07, 2012, 22:57 »

Уважаемые форумчане!
В связи с написанием бакалаврской работы возникла необходимость использовать элемент QWebView в динамической библиотеки (дада при обращении к моей dllке mydll.dll она загружает в себя пару страниц и обрабатывает их).

Вся программа строится на использовании сигнала loadFinished(), но как можно установить связь между ним и необходимой мне функцией?

Пример того, что я сделал:

есть класс

Код:
class Counter : public QObject

{

  Q_OBJECT

public:

  Counter() { m_value = 0; }

  int value() const { return m_value; }

public slots:

  void setValue(int value);

signals:

  void valueChanged(int newValue);

private:

  int m_value;

};

в главной функции библиотеки установлена связь:

Код:
extern "C" __declspec(dllexport) char * getArticles()
{

    int argc = 0;char* argv[1];
    *argv = "";
    pApp = new QApplication(argc, argv);
     QWebView view;

       Counter a;
       QObject::connect(&view, SIGNAL(loadProgress(int)),
                  &a, SLOT(setValue(int)));

 view.setUrl(QUrl("www.google.ru"));

       QString str_return=QString::number(a.value());

       char* return_char = new char[ str_return.toStdString().length() + 1 ]();
                  strcpy(return_char,str_return.toStdString().c_str());
                  return return_char;

}
Слот обработчик событий:

Код:
void Counter::setValue(int value)

{

  if (value != m_value) {

    m_value = value;

    emit valueChanged(value);

  }

}
Т.е. происходит так, что после  view.setUrl(QUrl("www.google.ru")) страница начинает загружаться в объект view, но основная функция не ждет и продолжает работать, что приводит к тому, что слот setValue не используется.
Пробовал таким образом связывать сигналы startLoad() и loadProgress(). Первый сработал и второй выдал 10 процентов. Так как можно дождаться полной загрузки страницы и создать слот-функцию обработчик этого события?
« Последнее редактирование: Апрель 07, 2012, 23:12 от Kauc » Записан
mutineer
Гость
« Ответ #1 : Апрель 07, 2012, 23:03 »

Код
C++ (Qt)
extern "C" __declspec(dllexport) char * getArticles()
{
    ...
    QWebView view;
    ...
    Counter a;
    ...
}
 

твой QWebView уничтожается при выходе из функции же
да и каунтер тоже
Записан
Kauc
Гость
« Ответ #2 : Апрель 07, 2012, 23:20 »

Это да, но как можно создать глобальный QWebView, если его объявление возможно только после объявления объекта QApplication:
Код:
int argc = 0;char* argv[1];
    *argv = "";
    pApp = new QApplication(argc, argv);
которое возможно только в функции?
Записан
mutineer
Гость
« Ответ #3 : Апрель 07, 2012, 23:23 »

Да очень просто - QApplication ты же создаешь в хипе, а не на стеке. Вот и те два объекта создавай в хипе
Записан
Kauc
Гость
« Ответ #4 : Апрель 07, 2012, 23:29 »

Вы имеете ввиду делать указатели?) Я не особо разбираюсь в чем отличие использования хипа от стека ):
Записан
mutineer
Гость
« Ответ #5 : Апрель 07, 2012, 23:32 »

это прискорбно, что ты решил писать бакалаврскую (или ее кусок) на языке, даже базы которого не знаешь...
да, я имею в виду "указатели"
Записан
Kauc
Гость
« Ответ #6 : Апрель 07, 2012, 23:36 »

С указателями я кое как разбираюсь. Но в данном случае это невозможно, т.к. программа отладчик (написанная на Delphi) ругается непонятно почему при использовании указателей в библиотеке. Есть ли другой вариант?
Записан
mutineer
Гость
« Ответ #7 : Апрель 07, 2012, 23:39 »

Есть - не пытаться смешивать Delphi и Qt/C++ без достаточного знания последнего. Но это имхо

Еще есть вариант рассказать как же оно ругается. А на pApp оно не ругается? кстати, не вижу где он объявлен
Записан
Kauc
Гость
« Ответ #8 : Апрель 07, 2012, 23:58 »

Программа-отладчик:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, StdCtrls;

type


  Test = function: Pchar; stdcall;

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  h: Cardinal;
  P: Test;
  i: Integer;
begin
  H := LoadLibrary('D:\8_semestr\bakalavr\MyLib2\release\MyLib2.dll');
P := Test(GetProcAddress(H, 'getArticles'));
ShowMessage(P);
Memo1.Text:=p;

end;

end.

при появлении строк

Код:
QWebView *view2=new QWebView;
view2->setUrl(QUrl("D:\\Google.htm"));

выдает ошибку:
Invalid floating point operation

И да, pApp объявлен ранее перед главной функцией:

Код:
QApplication* pApp = NULL;
extern "C" __declspec(dllexport) char * getArticles()
{
...
« Последнее редактирование: Апрель 08, 2012, 00:01 от Kauc » Записан
mutineer
Гость
« Ответ #9 : Апрель 08, 2012, 00:09 »

что-то я не вкуриваю в смысл сего кода:
Код:
P := Test(GetProcAddress(H, 'getArticles'));
ShowMessage(P);
Memo1.Text:=p;

P без скобок во второй строке - это типа вызов функции?

З.Ы. всегда бесила эта неопределенность делфяшников - не могут решить никак в каком же регистре имя переменной писать))
« Последнее редактирование: Апрель 08, 2012, 00:11 от mutineer » Записан
Kauc
Гость
« Ответ #10 : Апрель 08, 2012, 00:11 »

Код:
P := Test(GetProcAddress(H, 'getArticles'));
ShowMessage(P);
Memo1.Text:=p;
это попытка отладить сэкономив секунду времени (просто сначала функция возвращала 1-2 слова, а потом несколько страниц текста) Можете удалить что вам больше не нравится.

Пусть останется:
Код:
P := Test(GetProcAddress(H, 'getArticles'));
Memo1.Text:=Р;

Да, Р-это вызов функции.
« Последнее редактирование: Апрель 08, 2012, 00:14 от Kauc » Записан
mutineer
Гость
« Ответ #11 : Апрель 08, 2012, 00:14 »

Код:
Memo1.Text:=Р;

это присваивание результата вызова функции по указателю P?
меня отсутствие скобок смущает
Записан
Kauc
Гость
« Ответ #12 : Апрель 08, 2012, 00:19 »

Наличие/удаление скобок P() или P ни к чему не привело.
Записан
V1KT0P
Гость
« Ответ #13 : Апрель 08, 2012, 00:20 »

Наличие/удаление скобок P() или P ни к чему не привело.
Так а отладчик что говорит?
Записан
mutineer
Гость
« Ответ #14 : Апрель 08, 2012, 00:24 »

Наличие/удаление скобок P() или P ни к чему не привело.

Блин, ты и в делфи не разбираешься, чтоли? я спрашиваю - это вызов функции так выглядит (без скобок записывается, если без параметров функция)? а ты мне второй раз уже непонятно что отвечаешь
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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