使用 PySide 使并排小部件的顶部对齐
Getting the tops of side-by-side widgets to align using PySide
在下面的代码中,QTextEdit
和 QGraphicsView
小部件的顶部在使用 QHBoxLayout
时未对齐。但是,如果您注释掉 QTextEdit
并取消注释其他 QGraphicsView
设置,小部件的顶部将完美对齐。这是我的问题:
导致此对齐问题的原因是什么?如何解决?
使用 Qt Creator 是否可以最好地避免此类问题?
是否需要整个 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 似乎是最佳选择。
在下面的代码中,QTextEdit
和 QGraphicsView
小部件的顶部在使用 QHBoxLayout
时未对齐。但是,如果您注释掉 QTextEdit
并取消注释其他 QGraphicsView
设置,小部件的顶部将完美对齐。这是我的问题:
导致此对齐问题的原因是什么?如何解决?
使用 Qt Creator 是否可以最好地避免此类问题?
是否需要整个 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 似乎是最佳选择。