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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как передавать данные в QWebView  (Прочитано 4573 раз)
disassembler
Гость
« : Март 18, 2011, 14:52 »

проблема такая. как сделать постепенный вывод информации на QWebVew (в зависимости от какого нить события выводить текст в конец страницы). т.е. надо сделать что то наподобие чата. предполагаю что надо использовать какой нить джаваскрип который будет получать инфу и отображать ее. но как ее передавать на веб страницу из приложения пока не пойму. кто нить решал подобную проблему?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Март 18, 2011, 22:52 »

попробуй почитать про какой нить ajax и QWebFrame::evaluateJavaScript() Улыбающийся
Записан

kubuntu/Win7/x64/NetBeans
Stiff
Гость
« Ответ #2 : Март 18, 2011, 23:48 »

Можешь посмотреть исходники qutim, там как раз так и сделано
Записан
nanoKhrome
Гость
« Ответ #3 : Март 21, 2011, 13:14 »

Попробуй сделать нечто вроде простого innerHTML, что то типа:
Код
Javascript
document.getElementById("id").innerHTML = "text";
 

К сожалению как сделать это в Qt я не знаю так как сам только начал его учить  Подмигивающий
Записан
disassembler
Гость
« Ответ #4 : Март 24, 2011, 11:28 »

нашел решение!
спасибо всем за наводку! Подмигивающий
Программа построчно выводит текст:
test <номер строки> --- <время в милисекундах между последним выводом и текущим>
Все оказалось как всегда просто.
evaluateJavaScript() позволяет выполнить скрипт на html страничке.
сам скрипт тоже простой, его идея в том чтобы найти нужный элемент по id и потом с помощью функции innerHTML добавить в него элемент (текст).
вот код программы и html странички, которую гружу QWebView
App
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QUrl>
#include <QWebFrame>
#include <QTimer>
#include <QDateTime>

MainWindow* mainWindow;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->webView->setUrl(QUrl("qrc:/Html/chat.html"));

    QTimer *timer = new QTimer(this);
    timer->setInterval(1);
    connect(timer, SIGNAL(timeout()), this, SLOT(onTime()));
    timer->start();
}

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

void MainWindow::onTime()
{
    static int i=1;
    static QDateTime lastTime = QDateTime::currentDateTime();
    QDateTime curTime = QDateTime::currentDateTime();
    qint64 deltaTime = curTime.toMSecsSinceEpoch() - lastTime.toMSecsSinceEpoch();
    lastTime = curTime;
    QString jcode = QString("var chat_div = document.getElementById('div_chat');\r\n"
                            "chat_div.innerHTML += 'text %1 --- %2<br>';\r\n"
                            ).arg(i).arg(deltaTime);
    i++;
    QWebFrame *frame = ui->webView->page()->mainFrame();
    bool shouldScrollFurther = (frame->scrollBarMaximum(Qt::Vertical) == frame->scrollBarValue(Qt::Vertical));
    frame->evaluateJavaScript(jcode);
    QApplication::processEvents();
    if (shouldScrollFurther)
        scrollToEnd();
}

void MainWindow::scrollToEnd()
{
    QWebFrame *frame = ui->webView->page()->mainFrame();
    int scrollMax = frame->scrollBarMaximum(Qt::Vertical);
    frame->setScrollBarValue(Qt::Vertical, scrollMax);
}
chat.html
Код:
<html>
<body">
<div id="div_chat">
</div>
</body>
</html>


В связи с решением возникла другая задача. После 2000 тысяч строк QWebView начинает жутко тормозить и каждую последую сроку выводить все медленнее и медленнее (линейно). Есть идеи как это решить?
Хочу использовать QwebView для вывода отчета, а в нем строк немерено может быть.
Записан
disassembler
Гость
« Ответ #5 : Март 24, 2011, 11:56 »

Проблему с тормозами тоже удалось решить.
Как я понял, идея заключается в том, чтобы не писать все строки в один <div>, а добавлять каждую новую строку в своем диве прям в дескриптор <body>.
Привожу обновленный код программы (только измененную функцию):
App
Код:
void MainWindow::onTime()
{
    static int i=1;
    static QDateTime lastTime = QDateTime::currentDateTime();
    QDateTime curTime = QDateTime::currentDateTime();
    qint64 deltaTime = curTime.toMSecsSinceEpoch() - lastTime.toMSecsSinceEpoch();
    lastTime = curTime;
    QString jcode = QString("<div>text %1 --- %2</div>").arg(i).arg(deltaTime);
    i++;
    QWebFrame *frame = ui->webView->page()->mainFrame();
    QWebElement elem = frame->findFirstElement("body");
    bool shouldScrollFurther = (frame->scrollBarMaximum(Qt::Vertical) == frame->scrollBarValue(Qt::Vertical));
    elem.appendInside(jcode);


    QApplication::processEvents();
    if (shouldScrollFurther)
        scrollToEnd();
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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