【问题标题】:Getting the tops of side-by-side widgets to align using PySide使用 PySide 使并排小部件的顶部对齐
【发布时间】:2018-04-11 13:27:45
【问题描述】:

在下面的代码中,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_()

【问题讨论】:

    标签: python layout pyside


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。简洁明了。
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2015-05-05
    • 2018-08-14
    • 2017-08-02
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多