gpt4 book ai didi

python - 如何在 PyQt5 中根据中心而不是左角使用移动命令定位标签

转载 作者:行者123 更新时间:2023-12-01 07:19:55 25 4
gpt4 key购买 nike

嗨,我的 Qwidget 中有几个 QLabel。我得到了一个需要在 Qt 中创建的设计,但实际上它只有几个标签。但其中一个标签的文字是我的改变。所以文本长度也是可变的。我使用 move() 命令它以左角点作为引用点。我想我需要以标签的中心点作为引用点。

class App(QWidget):

def __init__(self):
super().__init__()
self.left = 0
self.top = 0
self.width = 480
self.height = 800
self.initUI()

def initUI(self):
#self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)


# Create widget
main_page = QLabel(self)
main_pixmap = QPixmap('main_page')
main_page.setPixmap(main_pixmap)


#logo
logo = QLabel(self)
logo_pixmap = QPixmap('logo')
logo.setPixmap(logo_pixmap)
logo.move(159,63)

#Date
today = format_date(datetime.datetime.now(),"dd MMMM", locale = 'tr').upper()
day = format_date(datetime.datetime.now(), "EEEE", locale = 'tr').upper()
date = QLabel(self)
date.setText(day + " " + today )
date.setFont(QFont("Lato", 24))
date.setStyleSheet('color:white')
self.move_to_center()

#Clock
clock = QLabel(self)
clock.setText(strftime('%H:%M'))
clock.setFont(QFont("Lato", 90))
clock.setStyleSheet('color:white')
clock.move(71,222)

如何动态地将标签水平放置在 Qwidget 的中间?

编辑:当我使用布局时,标签一个接一个地排列,如下所示 You see what I Mean here. I want something like on the right one. But all the labels should be centered horizantally

最佳答案

居中小部件的主要问题是它们可以根据其内容更改其大小。

针对您的情况,更简单的解决方案是创建一个具有固定宽度且文本中心对齐的标签:

        clock = QLabel(self)
clock.setText(strftime('%H:%M'))
clock.setFixedWidth(self.width())
clock.move(0, 222)
clock.setAlignment(Qt.AlignCenter)

虽然这很好,但有几个问题:

  • 如果标签有多于一行,并且您不希望它跨越整个宽度,则对齐方式将始终居中(这可能很难看);
  • 如果原始文本只有一行,而新文本有更多文本,则它将无法正确更新(除非您在每次文本更改后调用 label.adjustSize())

另一个解决方案是创建 QLabel 的子类,一旦显示或文本更改,它就会自动重新定位:

class CenterLabel(QLabel):
vPos = 0
def setText(self, text):
super(CenterLabel, self).setText(text)
if self.parent():
self.center()

def setVPos(self, y):
# set a vertical reference point
self.vPos = y
if self.parent():
self.center()

def center(self):
# since there's no layout, adjustSize() allows us to update the
# sizeHint based on the text contents; we cannot use the standard
# size() as it's unreliable when there's no layout
self.adjustSize()
x = (self.parent().width() - self.sizeHint().width()) / 2
self.move(x, self.vPos)

尽管如此,我仍然认为使用布局是更好、更简单的解决方案。您只需以主窗口小部件作为父级创建“背景”像素图,而不将其添加到布局中,然后设置布局并使用 layout.addSpacing 添加所有其他内容作为所有窗口之间的垂直间距小部件。

这里唯一的问题是,如果标签文本更改其行数,所有后续小部件将相应移动。如果是这种情况,只需为小部件设置一个固定高度,该高度等于小部件顶部与下一个小部件顶部之间的距离,然后将小部件添加到布局中,确保其水平居中且顶部对齐。

    def initUI(self):
#self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self._width, self._height)

self.background = QLabel(self)
self.background.setPixmap(QPixmap('background.png'))

layout = QVBoxLayout()
self.setLayout(layout)
# set spacing between items to 0 to ensure that there are no added margins
layout.setSpacing(0)

# add a vertical spacing for the top margin;
# I'm just using random values
layout.addSpacing(20)

main_page = QLabel(self)
main_pixmap = QPixmap('main_page')
main_page.setPixmap(main_pixmap)
# add the widget ensuring that it's horizontally centered
layout.addWidget(main_page, alignment=Qt.AlignHCenter)

#logo
logo = QLabel(self)
logo_pixmap = QPixmap('logo')
logo.setPixmap(logo_pixmap)
layout.addWidget(logo, alignment=Qt.AlignHCenter)

layout.addSpacing(50)

#Date
today = format_date(datetime.datetime.now(),"dd MMMM", locale = 'tr').upper()
day = format_date(datetime.datetime.now(), "EEEE", locale = 'tr').upper()
date = QLabel(self)
date.setText(day + " " + today )
date.setFont(QFont("Lato", 24))
date.setStyleSheet('color:white')
# set a fixed height equal to the vertical position of the next label
date.setFixedHeight(100)
# ensure that the label is always on top of its layout "slot"
layout.addWidget(date, alignment=Qt.AlignHCenter|Qt.AlignTop)

#Clock
clock = QLabel(self)
clock.setText(strftime('%H:%M'))
clock.setFont(QFont("Lato", 90))
clock.setStyleSheet('color:white')
layout.addWidget(clock, alignment=Qt.AlignHCenter|Qt.AlignTop)

# add a bottom "stretch" to avoid vertical expanding of widgets
layout.addStretch(1000)

关于python - 如何在 PyQt5 中根据中心而不是左角使用移动命令定位标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com