刚刚接触PyQt6 练习布局,有点难度!希望精通PyQt6的,帮忙看下!提供代码!付费悬赏!
23条回答 默认 最新
- 专家-司宇[在线] 2024-08-07 21:23关注
获得0.25元问题酬金 参考免费微信小程序:皆我百晓生 作答,经由专家-司宇整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。
要实现您描述的界面布局,我们可以使用 PyQt6 的
QMainWindow
类作为主窗口,并结合QWidget
、QGridLayout
、QPushButton
和QStackedWidget
来完成。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
),并通过按钮的点击事件切换堆栈中的页面。这样,当用户点击不同的菜单项时,右侧会显示相应的页面内容。解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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 位置函数报错?