2

QMainWindowほとんどの人がコンテンツのサイズを変更する方法を尋ねているようです.

長いテキストに設定QLabelすると、メインウィンドウが突然大きくなり、なぜそうなるのかわかりません。

次のコード例には、基本的に次のものが含まれています。

  • QMainWindow
    • QWidget中央ウィジェット として
      • QVBoxLayoutその子としての A
        • そのLabelBar中にA.

LabelBarであり、次のQWidgetものが含まれます。

  • QHBoxLayout
    • その中に2 つQLabelの s があります。

1 秒後、QTimer問題を示すためにラベルを長いテキストに設定します。

PyQt サンプル コード:

from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QLabel, QWidget,
                             QMainWindow, QVBoxLayout, QSizePolicy)
from PyQt5.QtCore import QTimer

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        cwidget = QWidget(self)
        self.setCentralWidget(cwidget)
        self.resize(100, 100)

        vbox = QVBoxLayout(cwidget)
        vbox.addWidget(QWidget())
        self.bar = LabelBar(self)
        vbox.addWidget(self.bar)

        timer = QTimer(self)
        timer.timeout.connect(lambda: self.bar.lbl2.setText("a" * 100))
        timer.start(1000)

class LabelBar(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        hbox = QHBoxLayout(self)
        self.lbl1 = QLabel(text="eggs")
        hbox.addWidget(self.lbl1)
        self.lbl2 = QLabel(text="spam")
        hbox.addWidget(self.lbl2)

if __name__ == '__main__':
    app = QApplication([])
    main = MainWindow()
    main.show()
    app.exec_()
4

1 に答える 1

3

メインウィンドウが大きくなるのは、レイアウトを使用することが目的であるためです。レイアウトは、すべてのコンテンツが正しく表示されるように、ウィジェットのサイズ要件を設定します。要件は子ウィジェットによって異なります。たとえば、QLabelデフォルトでは水平方向に大きくなり、そのコンテンツに合わせてスペースが必要になります。ウィンドウの拡大を防ぐには多くの方法があり、結果の動作はさまざまです。

  • QLabelを入れることができますQScrollArea。ラベルのテキストが長すぎると、スクロールバーが表示されます。
  • を使用してワードラップを有効にできますself.lbl2.setWordWrap(True)。いくつかのスペースでテキストを設定している限り、QLabelそれは複数行で表示され、ウィンドウは水平方向ではなく垂直方向に少し大きくなります。
  • QLabelを使用して のサイズのヒントを無視できますself.lbl2.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)QLabelのコンテンツは、そのレイアウトや親ウィジェットのサイズには影響しません。大きすぎるテキストは切り捨てられます。
于 2014-02-12T20:57:50.263 に答える