PyQt 将元素居中布局到全屏左侧
PyQt layouts center element to left in full screen
我正在使用 PyQt 构建一个简单的应用程序 运行 在 RPi 显示器上。我也是 PyQt 的新手。所以,屏幕的尺寸不会改变。因此,在这种情况下,我很乐意使用盒式布局或根本不使用布局。但是,我想得到正确的结果。此应用不需要 响应式 或自适应或任何东西。
这是我目前所做的:
class Window(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 1920, 1000)
# layout for date & time display
layout = QVBoxLayout()
# to prevent unnecessary spacing in full screen
layout.addStretch()
self.time = QLabel("Loading", self)
self.date = QLabel("Loading", self)
self.time.setFont(QFont('Ubuntu', 180))
self.date.setFont(QFont('Ubuntu', 50))
layout.addWidget(self.time)
layout.addWidget(self.date)
self.setLayout(layout)
timer = QTimer(self)
timer.timeout.connect(self.showTime)
timer.start(1000)
# method called by timer
def showTime(self):
current_time = QDateTime.currentDateTime()
# formatting date and time to string
date_time = current_time.toString('dddd, MMMM d, yyyy')
timer_time = current_time.toString('hh:mm AP')
# setting date & time to the label
self.time.setText(timer_time)
self.date.setText(date_time)
App = QApplication(sys.argv)
window = Window()
window.setStyleSheet("background-color: black; color: white; QLabel { margin-bottom: 500 }")
window.show()
App.exit(App.exec_())
我也试过完全不使用布局。通过使用 class Window(QMainWindow)
而不是 QWidget
。然后我尝试使用 move()
来正确定位日期和时间。但这会产生一个看起来很奇怪的输出,其中日期和时间都被限制在主 window 内的另一个小框中并且没有完全显示。
我想要的理想输出是日期和时间以 1920X1000 尺寸显示在屏幕的左中。我怎样才能做到这一点?
在 Tkinter 中,我可以用 grid() 做到这一点,就像这样:
time_label.grid(row = 0, column = 0, padx = 200, pady = (200, 0))
date_label.grid(row = 1, column = 0, padx = 200)
这就是最终的样子。 spotify 和地图标志是 Tkinter 中的按钮。任何帮助将不胜感激和赞成。
您已在布局顶部添加了 stretch
。拉伸是一种布局项,它可以在同一布局上的其他小部件允许的范围内自行扩展,在您的情况下,结果是通过将其他小部件放在底部,拉伸占据了所有可用的垂直 space。
如果要垂直居中小部件,只需在添加小部件后再添加 layout.addStretch()
行即可。
请注意,即使您认为不需要布局管理器,也很少有特定情况可以考虑使用该方法,并且手动设置小部件几何形状通常容易出现意外行为(而且很多无用的头痛)。
另一方面,您还想添加其他可能会放置在右侧的小部件。要正确实现这一点,嵌套布局是更简单直接的解决方案:
- 一个“主”QHBoxLayout
- 左侧(标签)的 QVBoxLayout,与您当前正在使用的一样
- 右侧小部件的另一个 QVBoxLayout,具有类似的行为
class Window(QWidget):
def __init__(self):
super().__init__()
mainLayout = QHBoxLayout()
leftLayout = QVBoxLayout()
mainLayout.addLayout(leftLayout)
# ...
leftLayout.addStretch()
layout.addWidget(self.time, alignment=Qt.AlignCenter)
layout.addWidget(self.date, alignment=Qt.AlignCenter)
layout.addStretch()
rightLayout = QVBoxLayout()
# ...
rightLayout.addStretch()
rightLayout.addWidget(self.spotifyWidget)
rightLayout.addStretch()
rightLayout.addWidget(self.gmapWidget)
rightLayout.addStretch()
self.setLayout(mainLayout)
请注意,Qt 布局有一个接受 QWidget 作为参数的商品构造函数,它会自动设置该小部件的布局:您可以像这样创建主布局:
mainLayout = QHBoxLayout(self)
然后你不需要使用setLayout()
。
我正在使用 PyQt 构建一个简单的应用程序 运行 在 RPi 显示器上。我也是 PyQt 的新手。所以,屏幕的尺寸不会改变。因此,在这种情况下,我很乐意使用盒式布局或根本不使用布局。但是,我想得到正确的结果。此应用不需要 响应式 或自适应或任何东西。
这是我目前所做的:
class Window(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 1920, 1000)
# layout for date & time display
layout = QVBoxLayout()
# to prevent unnecessary spacing in full screen
layout.addStretch()
self.time = QLabel("Loading", self)
self.date = QLabel("Loading", self)
self.time.setFont(QFont('Ubuntu', 180))
self.date.setFont(QFont('Ubuntu', 50))
layout.addWidget(self.time)
layout.addWidget(self.date)
self.setLayout(layout)
timer = QTimer(self)
timer.timeout.connect(self.showTime)
timer.start(1000)
# method called by timer
def showTime(self):
current_time = QDateTime.currentDateTime()
# formatting date and time to string
date_time = current_time.toString('dddd, MMMM d, yyyy')
timer_time = current_time.toString('hh:mm AP')
# setting date & time to the label
self.time.setText(timer_time)
self.date.setText(date_time)
App = QApplication(sys.argv)
window = Window()
window.setStyleSheet("background-color: black; color: white; QLabel { margin-bottom: 500 }")
window.show()
App.exit(App.exec_())
我也试过完全不使用布局。通过使用 class Window(QMainWindow)
而不是 QWidget
。然后我尝试使用 move()
来正确定位日期和时间。但这会产生一个看起来很奇怪的输出,其中日期和时间都被限制在主 window 内的另一个小框中并且没有完全显示。
我想要的理想输出是日期和时间以 1920X1000 尺寸显示在屏幕的左中。我怎样才能做到这一点?
在 Tkinter 中,我可以用 grid() 做到这一点,就像这样:
time_label.grid(row = 0, column = 0, padx = 200, pady = (200, 0))
date_label.grid(row = 1, column = 0, padx = 200)
这就是最终的样子。 spotify 和地图标志是 Tkinter 中的按钮。任何帮助将不胜感激和赞成。
您已在布局顶部添加了 stretch
。拉伸是一种布局项,它可以在同一布局上的其他小部件允许的范围内自行扩展,在您的情况下,结果是通过将其他小部件放在底部,拉伸占据了所有可用的垂直 space。
如果要垂直居中小部件,只需在添加小部件后再添加 layout.addStretch()
行即可。
请注意,即使您认为不需要布局管理器,也很少有特定情况可以考虑使用该方法,并且手动设置小部件几何形状通常容易出现意外行为(而且很多无用的头痛)。
另一方面,您还想添加其他可能会放置在右侧的小部件。要正确实现这一点,嵌套布局是更简单直接的解决方案:
- 一个“主”QHBoxLayout
- 左侧(标签)的 QVBoxLayout,与您当前正在使用的一样
- 右侧小部件的另一个 QVBoxLayout,具有类似的行为
class Window(QWidget):
def __init__(self):
super().__init__()
mainLayout = QHBoxLayout()
leftLayout = QVBoxLayout()
mainLayout.addLayout(leftLayout)
# ...
leftLayout.addStretch()
layout.addWidget(self.time, alignment=Qt.AlignCenter)
layout.addWidget(self.date, alignment=Qt.AlignCenter)
layout.addStretch()
rightLayout = QVBoxLayout()
# ...
rightLayout.addStretch()
rightLayout.addWidget(self.spotifyWidget)
rightLayout.addStretch()
rightLayout.addWidget(self.gmapWidget)
rightLayout.addStretch()
self.setLayout(mainLayout)
请注意,Qt 布局有一个接受 QWidget 作为参数的商品构造函数,它会自动设置该小部件的布局:您可以像这样创建主布局:
mainLayout = QHBoxLayout(self)
然后你不需要使用setLayout()
。