【问题标题】:How to get the QLayouts to expand properly?如何让 QLayouts 正确扩展?
【发布时间】:2012-08-26 15:01:07
【问题描述】:

我的结构如下:

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的高度。

我该如何解决这个问题?

【问题讨论】:

  • 你能更清楚地解释一下你的规模目标吗?首先,您希望在第一个水平布局中的标签和布局之间发生什么大小调整?二、你想要垂直布局中的标签(textedit?)和webview之间的大小关系是什么?您是否试图让 webview 永远不会有水平滚动条?
  • @jdi 我加了一张小图,有帮助吗?
  • 好的,谢谢。还有什么与 QTextEdit 的交易。你提到了两个 QLabels。
  • @jdi 我更新了它以更好地匹配图像。 QTextEdit 只是用来将文本转换为 html 页面。
  • 最后一个问题。在 QTextEdit 和 QWebView 之间,您如何希望它们的大小与内容相关?我现在对其他组件很清楚。但是什么时候应该可以看到竖线呢?

标签: c++ qt layout widget qwebview


【解决方案1】:

这是我对答案的看法......请原谅我,但它是用 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 视图随心所欲地增长,但会处理滚动条溢出。

【讨论】:

  • 这里的问题是 QWebView 不是全尺寸的,你只是隐藏了滚动条。否则,它真棒!谢谢!
  • 但如果它一直在扩大,它不是一直都尽可能完整吗?
  • 是的,你会这么想,但我不会这样。
  • 我可以使用某个内容源来准确了解您的意思吗?我很想彻底解决这个问题,但我似乎错过了这里的意思。
  • 我想我可以理解。刚刚做了更新。我有网络小部件的调整大小事件不断更新大小。是这样吗? (目前有点小问题,您必须调整窗口大小才能看到它开始执行此操作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多