Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Февраль 06, 2020, 16:14



Название: Почему QTextBrowser не совсем корректно грузит html страницы?
Отправлено: billy4685 от Февраль 06, 2020, 16:14
Здравствуйте, господа форумчане.

Пишу простой браузер для открытия html-справки. Для этого использую класс QTextBrowser.
Html страницы сохранены в web-страницы из Microsoft Office Word с использованием фильтров.

Заметил некие отличия в отображении полученных html страниц браузером QTextBrowser
и браузерами стандартными (Firefox, Google Chrome):
1) При использовании клавиши Ctrl и прокрутки мыши рисунки, в QTextBrowser не масштабируются,
хотя размер шрифта меняется. В стандартных браузерах данное масштабирование работает.
2) Заглавие страниц в QTextBrowser отображается по левому краю, а в стандартных по центру.
3) В QTextBrowser не работают абзацы, тогда как в стандартных абзацы срабатывают.
Походу QTextBrowser не все теги съедает.

main.cpp
Код:
#include "browser_dlg.h"
#include <QApplication>
#include <QStyleFactory>

int main(int argc, char *argv[])
{
QApplication::setStyle(QStyleFactory::create("fusion"));

QApplication app(argc, argv);
Browser_Dlg browser_dlg;
browser_dlg.show();

return app.exec();
}

browser_dlg.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_browser.h"
#include <QTreeWidget>

namespace Ui {
class MainWindow;
}

class Browser_Dlg : public QMainWindow
{
Q_OBJECT

public:

QString path_help;

explicit Browser_Dlg(QWidget *parent = 0);
~Browser_Dlg();
Ui::MainWindow *ui;

void create_tree_content(QString path_folder);
QString read_title(QString path);

public slots:
void open_html_file(QTreeWidgetItem *itm);

private:
};

#endif // MAINWINDOW_H

browser_dlg.cpp
Код:
#include "browser_dlg.h"
#include <QStyleFactory>
#include <QFileInfo>
#include <QTextStream>
#include <QDebug>
#include <QDir>

Browser_Dlg::Browser_Dlg(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
ui->setupUi(this);

QFont font_tree_header("Times New Roman", 12, QFont::Bold);
QFont font_tree_content("Times New Roman", 10, QFont::Normal);


path_help =  QApplication::applicationDirPath() + "/help";

ui->tree_content->resizeColumnToContents(0);
ui->tree_content->setStyle(QStyleFactory::create("windows"));
ui->tree_content->resizeColumnToContents(0);
ui->tree_content->setTextElideMode(Qt::ElideNone);
ui->tree_content->setWordWrap(true);
ui->tree_content->setFont(font_tree_content);
ui->tree_content->setHeaderLabel("Содержание:");
ui->tree_content->headerItem()->setTextAlignment(0, Qt::AlignCenter);
ui->tree_content->header()->setFont(font_tree_header);
ui->tree_content->header()->setStretchLastSection(true);

connect(ui->tree_content, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(open_html_file(QTreeWidgetItem*)));

create_tree_content(path_help);
}

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

void Browser_Dlg::create_tree_content(QString path_folder)
{
QDir dir;
dir.setPath(path_folder);

QStringList filters_file;
filters_file << "*.html" << "*.htm";

QFileInfoList files_info_list = dir.entryInfoList(filters_file, QDir::Files);

foreach (QFileInfo child_info, files_info_list)
  {
QTreeWidgetItem *item = new QTreeWidgetItem(ui->tree_content);

qDebug() << "Path: " << child_info.filePath();
item->setText(0, read_title(child_info.filePath()));
item->setData(0, Qt::UserRole, QVariant(child_info.filePath()));

ui->tree_content->addTopLevelItem(item);
  }
}

QString Browser_Dlg::read_title(QString path)
{
QString title = "";
QFile file_read(path);

if(file_read.open(QIODevice::ReadOnly))
  {
  QTextStream file_read_stream(&file_read);
  file_read_stream.setCodec(file_read_stream.codec());

  QString str = file_read_stream.readAll();

  file_read.close();

  QRegExp reg_title("<title>(.*)</title>");
  reg_title.setMinimal(true);

  int pos = 0;

  while((pos = reg_title.indexIn(str, pos)) != -1)
    {
    title = reg_title.cap(1);
    break;
    }
  }

return title;
}

void Browser_Dlg::open_html_file(QTreeWidgetItem *itm)
{
QString path_html = itm->data(0, Qt::UserRole).toString();
if(QFileInfo(path_html).suffix() == "html" || QFileInfo(path_html).suffix() == "htm")
  {
  ui->browser->setSource(QUrl("file:///" + path_html));
  }
}

Может кто знает как нужно настроить QTextBrowser, что-бы работали выше перечисленные функции?
Исходники также прикрепил в архиве. Само приложение и справка с htm файлами лежит по путям:
/Browser/OS_WIN/release/Browser.exe
/Browser/OS_WIN/release/help








Название: Re: Почему QTextBrowser не совсем корректно грузит html страницы?
Отправлено: Swa от Февраль 06, 2020, 16:37
Почему в БМВ есть климат контроль, а в моем запорожце нету?
Потому что эти функции не реализовали в QTextBrowser.

Цитировать
Может кто знает как нужно настроить QTextBrowser, что-бы работали выше перечисленные функции?
Берете исходники
https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtextbrowser.cpp.html (https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtextbrowser.cpp.html)
и добавляете нужные вам функции.


Название: Re: Почему QTextBrowser не совсем корректно грузит html страницы?
Отправлено: billy4685 от Февраль 06, 2020, 16:48
Почему в БМВ есть климат контроль, а в моем запорожце нету?
Потому что эти функции не реализовали в QTextBrowser.

Цитировать
Может кто знает как нужно настроить QTextBrowser, что-бы работали выше перечисленные функции?
Берете исходники
https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtextbrowser.cpp.html (https://code.woboq.org/qt5/qtbase/src/widgets/widgets/qtextbrowser.cpp.html)
и добавляете нужные вам функции.

Благодарю за совет. Буду разбираться.