首页 > 解决方案 > 无法创建欢迎屏幕,但布局的格式当前不起作用

问题描述

目前我正在尝试制作一个看起来像这样的布局:

欢迎页面布局图片示例

左侧会将用户重定向到唯一的创建帐户页面,具体取决于他们单击哪个按钮来说明他们是什么类型的用户(每种类型的用户需要不同的数据)。然后,在右侧,我希望按钮将用户重定向到登录页面。

这些框是我希望每个小部件应该位于的位置。

任何有关如何执行此操作的建议/示例或对以下代码的更正都将是惊人的!!!

我的(非常)损坏的代码是:

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
import sys
import os
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"

stylesheet = """
    QWidget{
        background-color: white;
    }

    QLabel#titleOfPage{
        font: 25px;
    }

    QLabel#genText{
        font: 15px;
    }
"""
#note that the last 3 are useless currently



class MyWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("Public Transport Application")
        self.setGeometry(200, 200, 800, 500)
        self.setWindowIcon(QIcon('Icon.jpg'))
        self.showMaximized()

        self.welcomePage()


    def welcomePage (self):

        #this is me trying to get a title at the top of the page (doesn't work)
        titleWidget = QtWidgets.QWidget()

        title = QtWidgets.QLabel('Welcome to the Queensland Transport Application')
        title.setObjectName('titleOfPage')

        titleWidget.setFixedHeight(100)



        #This is then me trying to create all the layoute for both sides so I can start adding things to either side (note ca means create account and si means sign in)
        layoutL = QtWidgets.QVBoxLayout()
        layoutL.addWidget(titleWidget)

        layoutL.addWidget(title)

        layoutCaSi = QtWidgets.QHBoxLayout()
        self.screenLayout = QtWidgets.QStackedLayout()

        layoutL.addLayout(self.screenLayout)

        caWidget = QtWidgets.QWidget()
        caLayout = QtWidgets.QVBoxLayout()
        caLayout.addWidget(caWidget)

        siWidget = QtWidgets.QWidget()
        siLayout = QtWidgets.QVBoxLayout()
        siLayout.addWidget(siWidget)


        layoutCaSi.addLayout(caLayout)
        layoutCaSi.addLayout(siLayout)

        layoutCaSi.addLayout(self.screenLayout)

        layoutL.addLayout(layoutCaSi)

    #this will be my create account page
    def caPage(self):
        pass

    #this will be my sign in page
    def siPage(self):
        pass

def main():
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(stylesheet)
    win = MyWindow()
    win.show()
    app.exec_()

main()

标签: pythonpython-3.xpyqt5

解决方案


我建议QGridLayout在主窗口的中央小部件上使用。我使用了两个 QSpacerItems 来保持小部件在标题标签和底部之间居中。顺便说一句,样式表QWidget {background-color: white;}将适用于从 QWidget 继承的所有内容,包括所有按钮和标签,不确定是否需要。

class MyWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Public Transport Application")
        self.setGeometry(200, 200, 800, 500)
        self.setWindowIcon(QIcon('Icon.jpg'))
        self.showMaximized()
        self.welcomePage()

    def welcomePage(self):
        centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(centralWidget)
        grid = QtWidgets.QGridLayout(centralWidget)
        grid.setVerticalSpacing(40) # Vertical space between widgets

        title = QtWidgets.QLabel('Welcome to the Queensland Transport Application')
        title.setObjectName('titleOfPage')
        title.setAlignment(Qt.AlignCenter)
        title.setFixedHeight(100)

        grid.addWidget(title, 0, 0, 1, 2)
        grid.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 1, 0, 1, 2)
        grid.addWidget(QLabel('Text'), 2, 0, Qt.AlignHCenter)
        grid.addWidget(QPushButton('Button 1'), 3, 0, Qt.AlignHCenter)
        grid.addWidget(QPushButton('Button 2'), 4, 0, Qt.AlignHCenter)
        grid.addWidget(QPushButton('Button 3'), 5, 0, Qt.AlignHCenter)
        grid.addWidget(QPushButton('Button'), 2, 1, 4, 1, Qt.AlignHCenter)
        grid.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 6, 0, 1, 2)

推荐阅读