【问题标题】:How can I create a properly sizing QWebView?如何创建大小合适的 QWebView?
【发布时间】:2012-08-31 23:58:13
【问题描述】:

我想让 QWebView 看起来扩展到宽度和高度,以便理想情况下它不会有滚动条。有些网站可能有固定的宽度,不允许这样做,但我不关心这些。无论如何,我不能如愿以偿,因为 QWebView 实现 sizeHint 如下:

QSize QWebView::sizeHint() const
{
    return QSize(800, 600); // ####...
}

这在很多层面上都是不正确的。 1.根本没有考虑实际网页的大小。 2.没有考虑高度和宽度是相互关联的。 (为了证明 #2 考虑换行到下一行的网页中的文本。)

作为一个简单的修复,我尝试做(QResizingWebView 扩展 QWebView):

QSize QResizingWebView::sizeHint() const{
    return this->page()->mainFrame()->contentsSize();
}

虽然这更接近结果,但它也有 2 个缺陷。 1. 没有考虑显示的宽/高之间的关系。 2. this->page()->mainFrame()->contentsSize() 从我的初步测试中可以看出是不准确的(它返回的高度在许多情况下都大于它应该的高度,尽管这可能与#1 有关)。

有人有解决此问题的提示吗?

【问题讨论】:

    标签: c++ qt widget sizing


    【解决方案1】:

    根据this post on qtcentre.org,您应该可以通过设置大小策略来纠正该行为。

    更新:

    在根本不修改大小策略的情况下,QWidget 上默认 QHBoxLayout 布局中的 QWebView 会导致 Web 视图在大于 800x600 的大小时在 QWidget 内正确调整大小(使用 QtCreator , C++, Windows 7, Qt 4.8.1)。

    更新 2:

    我做了一些挖掘,发现这个问题与您发布的a previous question有关,其中包含相关要求:)

    以下代码似乎满足这些要求。唯一相关的是我将QWebView 的水平和垂直大小策略更改为“扩展”。

    MainWindow.cpp:

    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    MainWindow.ui:

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QWidget" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>587</width>
        <height>442</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QLabel" name="label">
         <property name="text">
          <string>TextLabel</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
         </property>
        </widget>
       </item>
       <item>
        <layout class="QVBoxLayout" name="verticalLayout">
         <item>
          <widget class="QLabel" name="label_2">
           <property name="text">
            <string>TextLabel</string>
           </property>
           <property name="alignment">
            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QWebView" name="webView">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="url">
            <url>
             <string>http://www.google.ca/</string>
            </url>
           </property>
          </widget>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <customwidgets>
      <customwidget>
       <class>QWebView</class>
       <extends>QWidget</extends>
       <header>QtWebKit/QWebView</header>
      </customwidget>
     </customwidgets>
     <resources/>
     <connections/>
    </ui>
    

    更新 3: 更新 4:

    鉴于 cmets 中提供的 URL。显示如下。

    主窗口为 640x480:

    主窗口为 1024x768:

    【讨论】:

    • 我不知道为什么这对他有用,它真的不应该。 (它对我不起作用,我尝试了很多次)
    • 也许我没有理解正确。如果我使用 QWidget 作为主窗口并将 QWebView 放在水平布局中,QWebView 会展开以填充主窗口,并且仅在网页内容强制大小大于当前窗口时才显示滚动条。
    • 是的,HBoxLayout 会询问 QWidget 它想要的大小。 sizeHint 就是回答这个问题的原因。 sizeHint 表示它希望为 800x600,无论实际内容的大小是多少。因此,QHBoxLayout 将扩展到 800x600 以适应 sizeHint 大小。然后当实际渲染完成时,结果发现内容比 sizeHint 声明的要大得多。因此,即使 sizePolicy 说要展开,也会插入滚动条。
    • 当我的窗口大小远大于 800x600 时,QWebView 会展开以填满整个窗口,没有滚动条显示 1024x768 图像。
    • 对,那是因为您只有一个小部件,因此它的首选大小无关紧要。相反,如果您有多个小部件并且需要决定为每个小部件分配多少空间,那么首选尺寸很重要。
    【解决方案2】:

    我通过在扩展 QWebView 的自定义小部件中实现 heightForWidth 来实现它

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2017-11-12
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多