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()