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

时间:2017-10-30 14:13:27

标签: python layout pyside

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

  1. 导致此对齐问题的原因是什么以及如何修复?

  2. 使用Qt Creator可以最好地避免这样的问题吗?

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

  4. 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_()
    

1 个答案:

答案 0 :(得分:0)

布局有默认边距。因此,如果一个窗口小部件位于布局中,而其邻居不在布局中,则它们将不会对齐。要删除默认边距,您可以执行以下操作:

    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似乎是最好的选择。