系统托盘工具提示中的PyQt富文本格式化

3

这是一个简单的系统托盘PyQt应用程序的示例代码。

import sys
from PyQt4 import QtGui

def main():
   app = QtGui.QApplication(sys.argv)

   trayIcon = QtGui.QSystemTrayIcon(QtGui.QIcon('test.png'), app)
   menu = QtGui.QMenu()
   exitAction = menu.addAction("Exit")
   trayIcon.setContextMenu(menu)

   # I'd like to show picture in tooltip, BUT IT'S NOT WORK IN WINDOWS
   trayIcon.setTooltip('<img src="SomePicture.png" width="48" height="48"/>')

   trayIcon.show()
   sys.exit(app.exec_())

if __name__ == '__main__':
   main()

在这段代码中,我想展示一个带有图片和某种文本格式的气泡提示。为此,我使用了RichText标签格式。对于Ubuntu Linux系统(Gnome桌面),一切正常。但是,在Windows XP系统中尝试使用RichText格式化工具提示时,什么都不起作用。提示文本等于源字符串:“”。Python在Windows 2.7上运行,在Linux 2.6上运行,但我认为问题不在不同版本上。
如果在Windows操作系统中RichText无法解析,我该如何制作相同类型的GUI(跨平台最好)?
2个回答

3

感谢您的帮助,但不幸的是,QSystemTrayIcon.showMessage() 只能显示纯文本,不支持 RichText。"为给定标题、消息和图标显示气球消息,以毫秒为单位指定时间。标题和消息必须是纯文本字符串"。同时,MessageIcon 是枚举类型,因此只能使用标准图片。也许还有其他解决方案吗? - mblw
我能想到的另一件事就是创建一个无边框小部件并显示它。 - mata

2
如果有人也对创建气球小部件感兴趣,这是我的代码:
class SystemTrayIcon(QtGui.QSystemTrayIcon):
    def __init__(self, parent = None): 
        QtGui.QSystemTrayIcon.__init__(self, icon, parent)
        traySignal = "activated(QSystemTrayIcon::ActivationReason)"
        self.connect(self, QtCore.SIGNAL(traySignal), self._activateRoutine)
        self.balloon = balloonWidget(name)

    def _activateRoutine(self, reason):
        if reason == QtGui.QSystemTrayIcon.Trigger:
            self.balloon.show(self.geometry())

class balloonWidget(QtGui.QWidget):
    def __init__(self,name):
        QtGui.QWidget.__init__(self, parent = None, flags = QtCore.Qt.Popup)

        self.name = name

        self.offsetX = 10
        self.offsetY = 10

        self.outInfo = QtGui.QLabel(self)

        self.setStyleSheet("QWidget {border:5px solid rgb(170, 170, 255);}")

    def show(self,coord):
        richText = tr('Any text with Rich Format')
        self.outInfo.setText(richText)
        self.outInfo.show()
        self.adjustSize()

        origin = QtGui.QDesktopWidget().availableGeometry().bottomRight()

        if coord.y() < origin.y()/2:
            moveY = coord.bottomLeft().y() + self.offsetY
        else:
            moveY = coord.topLeft().y() - (self.height() + self.offsetY)

        if coord.x() + self.width() + self.offsetX >= origin.x():
            moveX = origin.x() - (self.width() + self.offsetX)
        else:
            moveX = coord.x()

        self.move(moveX,moveY)
        self.setVisible(True)

    def closeEvent(self, event):
        event.ignore()
        self.hide()

    def mousePressEvent(self, event):
        self.close()

ballonWidget.__init__ 的第一行不是多缩进了一层吗? - SwiftsNamesake
我尝试了一下,当我在“show”方法中删除对“tr”的调用(直接分配字符串)后,它就起作用了。 - SwiftsNamesake
@SwiftsNamesake 作为你的第一个评论:当然缩进是错的(我已经修复了)。如果您没有设置Qt翻译器,则“tr”方法将无法工作:您可以将其设置为UTF-8编码:QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("UTF-8")) - mblw
+1 好的,谢谢你让我知道。我对这个框架完全是新手。 - SwiftsNamesake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接