0

私の構造は次のとおりです。

QWidget
    -QHBoxLayout
         -QLabel
         -QVBoxLayout
              -QLabel
              -QWebView

コンテナがどんなに大きくても、HBoxLayoutが幅を埋めるようにしたいのですが、多かれ少なかれ行きません。ただし、QVBoxLayoutを拡張して、コンテンツの垂直方向のサイズに対応させたいと思います。

+ ------------- + ------------------------------ +
| FixedTitle:| タイトル幅に拡大+
| | ------------------------------ +
| | +
| | これは+にラップするテストです
| | 次の行+
| | +
| | +
| | +
| | bla bla bla +
| | +
| | +
| | +
| | 垂直スクロールはありません+
| | ここのバー+
+ ------------- + ------------------------------ +

この例では、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);

これには2つの問題があります。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 に答える