使用 PySide 使并排小部件的顶部对齐

Getting the tops of side-by-side widgets to align using PySide

在下面的代码中,QTextEditQGraphicsView 小部件的顶部在使用 QHBoxLayout 时未对齐。但是,如果您注释掉 QTextEdit 并取消注释其他 QGraphicsView 设置,小部件的顶部将完美对齐。这是我的问题:

  1. 导致此对齐问题的原因是什么?如何解决?

  2. 使用 Qt Creator 是否可以最好地避免此类问题?

  3. 是否需要整个 QGraphicsView() --> QGraphicsScene() --> QWidget() 来将图形放置在其他小部件旁边?

import sys
from PySide.QtCore import *
from PySide.QtGui import *


class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__()

        # Create Widget1
        widget1 = QTextEdit()
        #widget1 = QWidget()
        #view1 = QGraphicsView()
        #scene1 = QGraphicsScene(0,0,200,500)
        #view1.setScene(scene1)
        #layout = QHBoxLayout()
        #layout.addWidget(view1)
        #widget1.setLayout(layout)


        # Create Widget2
        widget2 = QWidget()
        view2 = QGraphicsView()
        scene2 = QGraphicsScene(0,0,200,500)
        view2.setScene(scene2)
        layout = QHBoxLayout()
        layout.addWidget(view2)
        widget2.setLayout(layout)


        # Layout of Side by Side windows
        container = QWidget()
        layout = QHBoxLayout()
        layout.addWidget(widget1)
        layout.addWidget(widget2)
        container.setLayout(layout)

        # Scroll Area Properties
        scroll = QScrollArea()
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setWidgetResizable(False)
        scroll.setWidget(container)

        # Scroll Area Layer add
        vLayout = QVBoxLayout(self)
        vLayout.addWidget(scroll)
        self.setLayout(vLayout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = Widget()
    dialog.show()
    app.exec_()

布局有默认边距。因此,如果一个小部件在布局中,而其邻居不在,则它们将不会对齐。要删除默认边距,您可以这样做:

    layout = QHBoxLayout()
    layout.setContentsMargins(0, 0, 0, 0)

但是,在您的示例中,QGraphicsView 的容器小部件和布局没有做任何有用的事情。因此,您可以删除这些,并进行一些其他简化,得出以下结果:

class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__()

        widget1 = QTextEdit()
        widget2 = QGraphicsView()
        widget2.setScene(QGraphicsScene(0, 0, 200, 500, widget2))

        container = QWidget()
        layout = QHBoxLayout(container)
        layout.addWidget(widget1)
        layout.addWidget(widget2)

        scroll = QScrollArea()
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setWidgetResizable(False)
        scroll.setWidget(container)

        vLayout = QVBoxLayout(self)
        vLayout.addWidget(scroll)

在试验复杂应用程序的布局时,使用 Qt Designer 当然非常有用。但是,与手动编码时所能实现的相比,它生成的代码通常非常冗长。不过,对于长期可维护性,使用 Qt Designer 似乎是最佳选择。