2016-10-04 27 views
-2

rebz!此代碼不工作 - 圖標完全transperent。我永遠不知道該怎麼做。在GUI線程外使用pixmaps是不安全的

class SystemTrayIcon: 
def __init__(self, icon_app, icon_pause, icon_work, parent=None): 
    self.STATUS_WORK = 2 
    self.STATUS_PAUSE = 1 
    self.STATUS_APP = 0 

    self.tray = QSystemTrayIcon(icon_app, parent) 
    api.gui.connector.connect_slot(object_name=) 
    self.icons = { 
     0:icon_app, 
     1:icon_pause, 
     2:icon_work 
    } 

    self.menu = QMenu(parent) 
    self.tray.setContextMenu(self.menu) 
    print self.tray.thread() 
    # self.set_status(2) 

def set_status(self, status): 
    self.tray.setIcon(self.icons[status]) 

我調用方法set_status在第二線程。幫我請(:

+0

只能在主(UI線程)修改UI。如果你試圖在其他線程中做 - 你甚至應該崩潰。嘗試不要調用'set_status'方法直接發出信號,這會連接到'set_status'插槽。或者,如果你真的不想使用信號,請查看'invokeMethod'文檔(從其他線程調用方法)。 – Shf

+0

「我在第二個線程中調用方法set_status」不這樣做。 – Goyo

回答

0

我假設標題...

這不是安全使用GUI線程

外面像素圖的是你看到的時候出錯/警告消息代碼運行。

一般來說,不,這不是安全操縱其他的是其上的QApplication本身被實例化任何線程QPixmap。這是因爲QPixmap實施(對於大多數Os而言)與底層圖形系統緊密相連。

如果您在非gui線程上想要更改/設置圖標的代碼,請使用排隊信號或類似的機制。

+0

...或使用'QImage'。 –

0

解決的問題:

class SystemTrayIcon: 
def __init__(self, icon_app, icon_pause, icon_work, parent=None): 
    self.STATUS_APP = 0 
    self.STATUS_PAUSE = 1 
    self.STATUS_WORK = 2 

    self.tray = QSystemTrayIcon(icon_app, parent) 
    self.icons = { 
     0:icon_app, 
     1:icon_pause, 
     2:icon_work 
    } 

    self.menu = QMenu(parent) 
    self.tray.setContextMenu(self.menu) 
    print self.tray.thread() 
    self.tray.connect(self.tray, SIGNAL("change_status(int)"), self.set_status) 
    # self.set_status(2) 

def set_status(self, status): 
    self.tray.setIcon(self.icons[status]) 

而另一個線程: tray.emit(SIGNAL("change_status(int)"), STATUS_PAUSE)

相關問題