鹤山A 2024-08-07 21:21 采纳率: 40%
浏览 14
已结题

pyqt6常规布局问题!我刚学 有点难度!

img

刚刚接触PyQt6 练习布局,有点难度!希望精通PyQt6的,帮忙看下!提供代码!付费悬赏!

  • 写回答

23条回答 默认 最新

  • 专家-司宇[在线] 2024-08-07 21:23
    关注
    获得0.25元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-司宇整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要实现您描述的界面布局,我们可以使用 PyQt6 的 QMainWindow 类作为主窗口,并结合 QWidgetQGridLayoutQPushButtonQStackedWidget 来完成。QStackedWidget 用于根据菜单切换不同的页面。

    下面是实现这个布局的基本代码示例:

    import sys
    from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QLabel, QGridLayout, \
        QStackedWidget, QHBoxLayout, QSpacerItem, QSizePolicy
    from PyQt6.QtGui import QPixmap
    from PyQt6.QtCore import Qt
    
    class Header(QWidget):
        def __init__(self):
            super().__init__()
            layout = QHBoxLayout()
            layout.setContentsMargins(10, 10, 10, 10)
            layout.setSpacing(10)
    
            # 设置顶栏背景色
            self.setStyleSheet("background-color: #dcdcdc;")  # 浅灰色背景
    
            # 左侧标签
            self.welcome_label = QLabel("胡胡~欢迎登录!")
            layout.addWidget(self.welcome_label)
    
            # 右侧头像和昵称
            right_layout = QHBoxLayout()
            right_layout.addStretch()
    
            self.avatar_label = QLabel()
            self.avatar_label.setFixedSize(40, 40)  # 缩小头像
            self.avatar_label.setStyleSheet("border-radius: 20px; background-color: white; border: 2px solid #ccc;")
            right_layout.addWidget(self.avatar_label)
    
            self.nickname_label = QLabel("胡胡")
            right_layout.addWidget(self.nickname_label)
    
            layout.addLayout(right_layout)
            self.setLayout(layout)
            self.setFixedHeight(60)
    
    class MainMenu(QWidget):
        def __init__(self):
            super().__init__()
            layout = QVBoxLayout()
            layout.setContentsMargins(0, 0, 0, 0)
            layout.setSpacing(5)
            self.setLayout(layout)
            self.setStyleSheet("background-color: #000000;")  # 设置菜单区域背景色
    
            # 添加按钮
            self.buttons = {}
            for i in range(1, 5):
                button = QPushButton(f"菜单{i}")
                button.setStyleSheet("color: black; background-color: white;")  # 白色按钮,黑色文字
                button.setFixedHeight(40)  # 设置按钮高度
                button.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)  # 确保按钮宽度可扩展
                self.buttons[f"button{i}"] = button
                layout.addWidget(button)
    
    class MenuPage(QWidget):
        def __init__(self, title):
            super().__init__()
            layout = QVBoxLayout()
            layout.setContentsMargins(0, 0, 0, 0)
            layout.setAlignment(Qt.AlignmentFlag.AlignCenter)
            label = QLabel(title)
            label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            layout.addWidget(label)
            self.setLayout(layout)
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
    
            # 主界面布局
            central_widget = QWidget()
            self.setCentralWidget(central_widget)
            main_layout = QVBoxLayout()
            central_widget.setLayout(main_layout)
    
            # 顶栏
            self.header = Header()
            main_layout.addWidget(self.header)
    
            # 主内容区域
            content_layout = QGridLayout()
            content_layout.setContentsMargins(0, 0, 0, 0)
            content_layout.setSpacing(0)
            main_layout.addLayout(content_layout)
    
            # 左侧菜单栏
            self.main_menu = MainMenu()
            content_layout.addWidget(self.main_menu, 0, 0, 1, 1)
    
            # 页面堆栈
            self.stacked_widget = QStackedWidget()
            self.page1 = MenuPage("菜单页面1")
            self.page2 = MenuPage("菜单页面2")
            self.page3 = MenuPage("菜单页面3")
            self.page4 = MenuPage("菜单页面4")
    
            self.stacked_widget.addWidget(self.page1)
            self.stacked_widget.addWidget(self.page2)
            self.stacked_widget.addWidget(self.page3)
            self.stacked_widget.addWidget(self.page4)
    
            # 添加到内容区域
            content_layout.addWidget(self.stacked_widget, 0, 1, 1, 1)
    
    
            # 为了确保内容区域能适应窗口大小的变化,可以设置列的伸缩因子
            content_layout.setColumnStretch(0, 0)  # 左侧菜单栏不伸缩
            content_layout.setColumnStretch(1, 1)  # 内容区域伸缩以填充剩余空间
    
            # 菜单按钮与页面切换逻辑
            for i in range(1, 5):
                button = self.main_menu.buttons[f"button{i}"]
                button.clicked.connect(lambda _, x=i: self.stacked_widget.setCurrentIndex(x-1))
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = MainWindow()
        window.show()
        sys.exit(app.exec())
    

    这段代码首先创建了一个包含欢迎信息的 MainMenu 类和展示不同菜单内容的 MenuPage 类。在 MainWindow 类中,我们设置了左侧的菜单栏和右侧的页面堆栈(QStackedWidget),并通过按钮的点击事件切换堆栈中的页面。这样,当用户点击不同的菜单项时,右侧会显示相应的页面内容。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 创建了问题 8月7日

悬赏问题

  • ¥15 Opencv配置出错
  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?