我目前正在 python/pyside2 中开发一个托盘应用程序。我正在尝试创建自定义 QMenu 项目(包含 QLabels 和 QProgressBars)。我设法获得了基本功能,但是 QLabels 的对齐方式和字体大小与常规的 QAction 菜单项不同。我解决了 QLayout 边距的对齐问题,但这些是硬编码的大小,我相信有办法以某种方式获得正确的值。
这是演示代码:
from PySide2.QtGui import *
from PySide2.QtWidgets import *
def quit_action_clicked():
app.quit()
def test_action_clicked():
pass
if __name__ == "__main__":
app = QApplication([])
app.setQuitOnLastWindowClosed(False)
icon = QIcon("assets/icons.iconset/icon_128x128.png")
tray = QSystemTrayIcon()
tray.setIcon(icon)
tray.setVisible(True)
menu = QMenu()
add_action = QAction("Barfoobaz")
menu.addAction(add_action)
test_action = QAction("Foobarbaz")
test_action.triggered.connect(test_action_clicked)
menu.addAction(test_action)
menu.addSeparator()
widget = QWidget()
layout = QVBoxLayout()
innerLayout = QGridLayout()
innerLayout.setSpacing(2)
innerLayout.setContentsMargins(0, 0, 0, 3)
innerLayout.addWidget(QLabel("Name:"), 0, 0)
innerLayout.addWidget(QLabel("tank"), 0, 1)
innerLayout.addWidget(QLabel("GUID:"), 1, 0)
innerLayout.addWidget(QLabel("12345678901234567890"), 1, 1)
innerLayout.addWidget(QLabel("Status:"), 2, 0)
innerLayout.addWidget(QLabel("healthy"), 2, 1)
layout.addLayout(innerLayout)
bar = QProgressBar()
bar.setValue(70)
layout.addWidget(bar)
layout.addWidget(QLabel("Size: 2TB, 1.87TB free"))
layout.setContentsMargins(21, 0, 15, 0)
layout.setSpacing(0)
widget.setLayout(layout)
berAction = QWidgetAction(menu)
berAction.setDefaultWidget(widget)
menu.addAction(berAction)
menu.addSeparator()
action = QAction("Quit")
action.triggered.connect(quit_action_clicked)
menu.addAction(action)
tray.setContextMenu(menu)
app.exec_()
这是它的外观:
有没有办法:
- 获取正确的边距值以匹配标准菜单项
- 获取字体以匹配标准菜单项