0

我的结构如下:

QWidget
    -QHBoxLayout
         -QLabel
         -QVBoxLayout
              -QLabel
              -QWebView

我希望 HBoxLayout 填充宽度,无论容器可能有多大,但不会多或少。但是,我希望 QVBoxLayout 扩展以适应其内容在垂直方向上的大小。

+-------------+------------------+
| 固定标题:| 扩展到宽度标题 +
| |------------------------------+
| | +
| | 这是一个包含到+的测试
| | 下一行 +
| | +
| | +
| | +
| | 呜呜呜呜+
| | +
| | +
| | +
| | 没有垂直滚动 +
| | 这里的酒吧 +
+-------------+------------------+

在此示例中,FixedTitle 的宽度可以任意大,但永远不会调整大小。扩展至宽度标题会填满剩余的水平空间。

到目前为止,我有:


this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
QHBoxLayout *layout = new QHBoxLayout;
this->setLayout(layout);

layout->addWidget(new QLabel(QString("FixedTitle")), 0, Qt::AlignTop);

QVBoxLayout *v_layout = new QVBoxLayout;
v_layout->setSizeConstraint(QLayout::SetNoConstraint);
layout->addLayout(v_layout);

v_layout ->addWidget(new QLabel(QString("Expanding to Width Title")), 1, Qt::AlignTop | Qt::AlignLeft);

QWebView *view = new QWebView();

QTextEdit text;
text.setPlainText(QSString("\nthis is a test which wraps to the next line\n\n\nbla bla bla\n\n\nthere are no vertical scroll bars here"));
view->setHtml(text.toHtml());

int width = view->page()->mainFrame()->contentsSize().width();
int height = view->page()->mainFrame()->contentsSize().height();
view->page()->setViewportSize(QSize(width, height));
view->resize(width, height);
view->setFixedSize(width, height);

v_layout->addWidget(view);

这有两个问题:1.它忽略了容器的宽度和2.它仍然没有正确获得QWebView的高度。

我该如何解决?

4

1 回答 1

2

这是我对答案的看法……请原谅我,但它是用 PyQt 写的。

我觉得您不应该过多考虑将包含小部件的大小调整为 QWebView 的内容,而只是将大小策略设置为扩展,关闭滚动条,并将大小调整到此容器添加到的任何布局. 尝试手动调整它的大小是没有意义的。

from PyQt4 import QtCore, QtGui, QtWebKit

class WebWidget(QtGui.QWidget):

    def __init__(self):
        super(WebWidget, self).__init__()

        layout = QtGui.QHBoxLayout(self)

        title = QtGui.QLabel("FixedTitle:")
        # title.setText("A much larger fixed title")

        title.setSizePolicy(
            QtGui.QSizePolicy.Preferred, 
            QtGui.QSizePolicy.Fixed)

        layout.addWidget(title, 0, QtCore.Qt.AlignTop)

        v_layout = QtGui.QVBoxLayout()
        layout.addLayout(v_layout)

        expandingTitle = QtGui.QLabel("Expanding to Width Title")
        expandingTitle.setSizePolicy(
            QtGui.QSizePolicy.Expanding, 
            QtGui.QSizePolicy.Fixed)

        v_layout.addWidget(expandingTitle)

        text = QtGui.QTextEdit()

        view = QtWebKit.QWebView()
        view.setSizePolicy(
            QtGui.QSizePolicy.Expanding, 
            QtGui.QSizePolicy.Expanding)

        view.page().mainFrame().setScrollBarPolicy(
            QtCore.Qt.Vertical, 
            QtCore.Qt.ScrollBarAlwaysOff )

        view.page().mainFrame().setScrollBarPolicy(
            QtCore.Qt.Horizontal, 
            QtCore.Qt.ScrollBarAlwaysOff )

        v_layout.addWidget(view, 1)

        text.setPlainText("""
            this is a test which wraps to the next line\n\n\n
            bla bla bla\n\n\nthere are no vertical scroll bars here
            """)
        view.setHtml(text.toHtml())

        v_layout.addStretch()

        self.view = view
        view.page().mainFrame().contentsSizeChanged.connect(self.updateWebSize)

    def updateWebSize(self, size=None):
        if size is None:
            size = self.view.page().mainFrame().contentsSize()
        self.view.setFixedSize(size)

    def resizeEvent(self, event):
        super(WebWidget, self).resizeEvent(event)
        self.updateWebSize()


if __name__ == "__main__":

    app = QtGui.QApplication([])

    w = QtGui.QScrollArea()
    w.resize(800,600)

    web = WebWidget()
    w.setWidget(web)
    w.setWidgetResizable(True)

    w.show()

    app.exec_()
  • 左侧标题设置为首选宽度和固定高度,以便获得所需的宽度但不会垂直增长。
  • 扩展标题获得扩展宽度策略和固定高度。
  • QWebView 获得双向扩展策略,并且它的滚动条关闭。

举个例子。我刚刚创建了一个 QScrollArea 并将 WebWidget 设置在其中,这样您就可以看到父布局将允许 Web 视图随心所欲地增长,但会处理滚动条溢出。

于 2012-08-31T20:19:53.487 回答