效果图:
代码:
import sys
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QStackedWidget, QWidget, \
QHBoxLayout, QLabel
class SidebarWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Sidebar Example')
self.setGeometry(100, 100, 800, 600)
# 创建 QListWidget
self.listWidget = QListWidget(self)
self.listWidget.setMaximumWidth(42)
self.listWidget.setStyleSheet('background-color: #f2f2f2; border: none')
self.listWidget.setSizeAdjustPolicy(QListWidget.AdjustToContents)
# 添加 QListWidgetItem
# 加载原始图标
self.listWidget.setIconSize(QSize(35, 35))
icon1 = QPixmap('..//images//annotation.png')
icon2 = QPixmap('..//images//statis.png')
item1 = QListWidgetItem(QIcon(icon1), '', self.listWidget)
item2 = QListWidgetItem(QIcon(icon2), '', self.listWidget)
item1.setToolTip('widget1')
item2.setToolTip('widget2')
# 设置每个条目只显示图标的宽度,并保持右侧边框显示
for item in (item1, item2):
item.setSizeHint(QSize(35, 35)) # 设置条目的大小为图标的大小
self.listWidget.addItem(item)
# 创建 QStackedWidget
self.stackedWidget = QStackedWidget(self)
# 创建 QWidget 并添加到 QStackedWidget 中
self.widget1 = QWidget(self)
self.widget1.setStyleSheet('background-color: white')
self.label1 = QLabel(self.widget1)
self.label1.setText('widget1')
self.widget2 = QWidget(self)
self.widget2.setStyleSheet('background-color: lightgray')
self.label2 = QLabel(self.widget2)
self.label2.setText('widget2')
self.stackedWidget.addWidget(self.widget1)
self.stackedWidget.addWidget(self.widget2)
# 显示默认的 widget
self.showWidget1()
# 将 QListWidget 和 QStackedWidget 添加到主窗口
container = QWidget(self)
container.setLayout(self.createLayout())
self.setCentralWidget(container)
# 连接 QListWidget 的 currentItemChanged 事件
self.listWidget.currentItemChanged.connect(self.onItemChanged)
def createLayout(self):
layout = QHBoxLayout()
layout.addWidget(self.listWidget)
layout.addWidget(self.stackedWidget)
return layout
def onItemChanged(self, currentItem: QListWidgetItem, previousItem: QListWidgetItem):
print(currentItem.toolTip())
if currentItem.toolTip() == 'widget1':
self.showWidget1()
elif currentItem.toolTip() == 'widget2':
print(1)
self.showWidget2()
def showWidget1(self):
self.stackedWidget.setCurrentWidget(self.widget1)
def showWidget2(self):
self.stackedWidget.setCurrentWidget(self.widget2)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SidebarWindow()
window.show()
sys.exit(app.exec_())