Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Kauc от Апрель 07, 2012, 22:57



Название: QWebView
Отправлено: 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 процентов. Так как можно дождаться полной загрузки страницы и создать слот-функцию обработчик этого события?


Название: Re: QWebView
Отправлено: mutineer от Апрель 07, 2012, 23:03
Код
C++ (Qt)
extern "C" __declspec(dllexport) char * getArticles()
{
    ...
    QWebView view;
    ...
    Counter a;
    ...
}
 

твой QWebView уничтожается при выходе из функции же
да и каунтер тоже


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


Название: Re: QWebView
Отправлено: mutineer от Апрель 07, 2012, 23:23
Да очень просто - QApplication ты же создаешь в хипе, а не на стеке. Вот и те два объекта создавай в хипе


Название: Re: QWebView
Отправлено: Kauc от Апрель 07, 2012, 23:29
Вы имеете ввиду делать указатели?) Я не особо разбираюсь в чем отличие использования хипа от стека ):


Название: Re: QWebView
Отправлено: mutineer от Апрель 07, 2012, 23:32
это прискорбно, что ты решил писать бакалаврскую (или ее кусок) на языке, даже базы которого не знаешь...
да, я имею в виду "указатели"


Название: Re: QWebView
Отправлено: Kauc от Апрель 07, 2012, 23:36
С указателями я кое как разбираюсь. Но в данном случае это невозможно, т.к. программа отладчик (написанная на Delphi) ругается непонятно почему при использовании указателей в библиотеке. Есть ли другой вариант?


Название: Re: QWebView
Отправлено: mutineer от Апрель 07, 2012, 23:39
Есть - не пытаться смешивать Delphi и Qt/C++ без достаточного знания последнего. Но это имхо

Еще есть вариант рассказать как же оно ругается. А на pApp оно не ругается? кстати, не вижу где он объявлен


Название: Re: QWebView
Отправлено: Kauc от Апрель 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()
{
...


Название: Re: QWebView
Отправлено: mutineer от Апрель 08, 2012, 00:09
что-то я не вкуриваю в смысл сего кода:
Код:
P := Test(GetProcAddress(H, 'getArticles'));
ShowMessage(P);
Memo1.Text:=p;

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

З.Ы. всегда бесила эта неопределенность делфяшников - не могут решить никак в каком же регистре имя переменной писать))


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

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

Да, Р-это вызов функции.


Название: Re: QWebView
Отправлено: mutineer от Апрель 08, 2012, 00:14
Код:
Memo1.Text:=Р;

это присваивание результата вызова функции по указателю P?
меня отсутствие скобок смущает


Название: Re: QWebView
Отправлено: Kauc от Апрель 08, 2012, 00:19
Наличие/удаление скобок P() или P ни к чему не привело.


Название: Re: QWebView
Отправлено: V1KT0P от Апрель 08, 2012, 00:20
Наличие/удаление скобок P() или P ни к чему не привело.
Так а отладчик что говорит?


Название: Re: QWebView
Отправлено: mutineer от Апрель 08, 2012, 00:24
Наличие/удаление скобок P() или P ни к чему не привело.

Блин, ты и в делфи не разбираешься, чтоли? я спрашиваю - это вызов функции так выглядит (без скобок записывается, если без параметров функция)? а ты мне второй раз уже непонятно что отвечаешь


Название: Re: QWebView
Отправлено: Kauc от Апрель 08, 2012, 00:50
mutineer:Да, вы верно решили - это вызов функции. Если у функции нет параметров, то  и скобки не нужны.

V1KT0P: ничего, я неверно назвал эту программу отладчиком. Это просто тестирующая программа. Ее ошибку я уже писал: Invalid floating point operation при использовании указателей в dllке.


Название: Re: QWebView
Отправлено: V1KT0P от Апрель 08, 2012, 00:57
V1KT0P: ничего, я неверно назвал эту программу отладчиком. Это просто тестирующая программа. Ее ошибку я уже писал: Invalid floating point operation при использовании указателей в dllке.
Ну так ты запускал под отладчиком? Куда указывает бэктрейс?


Название: Re: QWebView
Отправлено: kamre от Апрель 08, 2012, 01:07
А что в самом Delphi нет аналога QWebView? Зачем скрещивать ужа с ежом?


Название: Re: QWebView
Отправлено: Kauc от Апрель 08, 2012, 01:19
kamre: Изначально не планировалось писать библиотеку, это потребовалось, когда уже был написан 1к кода ):

V1KT0P: Под DELPHI я не знаю как использовать отладчик для библиотеки, написанной в qt. Если же использовать программу-тестер, написанную на qt, то она выдает отдельные ошибки moc компилятора, достойные отдельной темы. И заметьте, ничего этого не было бы, если изначально обойтись без указателей:
Код:
QWebView view;
вместо
Код:
QWebView *view=new QWebView;


Название: Re: QWebView
Отправлено: mutineer от Апрель 08, 2012, 01:28
kamre: Изначально не планировалось писать библиотеку, это потребовалось, когда уже был написан 1к кода ):

В этой фразе нет ни одной причины НЕиспользовать делфяшные компоненты, вместо Qt

Цитировать
И заметьте, ничего этого не было бы, если изначально обойтись без указателей
Заметь, что создание QWebView на стеке локально не будет работать в этом случае


Название: Re: QWebView
Отправлено: V1KT0P от Апрель 08, 2012, 01:35
V1KT0P: Под DELPHI я не знаю как использовать отладчик для библиотеки, написанной в qt. Если же использовать программу-тестер, написанную на qt, то она выдает отдельные ошибки moc компилятора, достойные отдельной темы. И заметьте, ничего этого не было бы, если изначально обойтись без указателей:
Код:
QWebView view;
вместо
Код:
QWebView *view=new QWebView;
Ну раз такое дело, то попробуй:
Код:
static QWebView view;
Вроде проблем не должно, но опыта такого использования в библиотеках у меня нет.
И да если уже 1к на дельфи написан, то может и веб на нем писать? Если 1к на кьют, то может и остальное лучше бы на кьюте?


Название: Re: QWebView
Отправлено: Kauc от Апрель 08, 2012, 01:46
Цитировать
Цитировать
kamre: Изначально не планировалось писать библиотеку, это потребовалось, когда уже был написан 1к кода ):

В этой фразе нет ни одной причины НЕиспользовать делфяшные компоненты, вместо Qt

Вы предлагаете все заново переписывать на Delphi?

Цитировать
Ну раз такое дело, то попробуй:
Код:
static QWebView view;

Первое, что пришло в голову после ответа в этой теме о необходимости глобального объявления. Но Delphi все-равно выдает ошибку Invalid floating point operation на строку
Код:
static QWebView view;
Видать, придется разбираться именно с этой проблемой..


Название: Re: QWebView
Отправлено: Kauc от Апрель 08, 2012, 01:58
Аха, только что заметил, что если объявлять
Код:
QWebView *view=new QWebView;
или
Код:
static QWebView view;
в любой другой функции (не в extern "C" __declspec(dllexport) char *getArticles();), то ошибка исчезает. Наверное как-то связано с "C" (:


Название: Re: QWebView
Отправлено: mutineer от Апрель 08, 2012, 12:24
Цитировать
Цитировать
kamre: Изначально не планировалось писать библиотеку, это потребовалось, когда уже был написан 1к кода ):

В этой фразе нет ни одной причины НЕиспользовать делфяшные компоненты, вместо Qt

Вы предлагаете все заново переписывать на Delphi?

Чувак, ты очень странный... очень... ты предлагаешь мне мысли твои прочитать? Основной проект у тебя на делфи? или не на делфи? или зачем вообще все заново переписывать на делфи? где в твоем сообщении "Изначально не планировалось писать библиотеку, это потребовалось, когда уже был написан 1к кода ):" хоть слово про делфи?