سؤال

هل هناك طريقة لتقليل الدرج في Pyqt4؟ لقد عملت بالفعل مع فئة QSYSTERTRAYICON، ولكن الآن أود أن تقلل أو "إخفاء" نافذة التطبيق الخاصة بي، وإظهار أيقونة الدرج فقط.

هل فعل أي شخص هذا؟ أي توجيه سيكون مقدرا.

باستخدام Python 2.5.4 و PYQT4 على نافذة XP Pro

هل كانت مفيدة؟

المحلول

انها واضحة جدا بمجرد تذكر أنه لا توجد وسيلة لتقليلها في الواقع إلى علبة النظام.

بدلا من ذلك، أنت مزيف من خلال القيام بذلك:

  1. قبض على الحد الأدنى للحدث على نافذتك
  2. في تقليل معالج الأحداث، قم بإنشاء وإظهار QSySTerTrayon
  3. أيضا في تقليل معالج الأحداث، استدعاء إخفاء () أو موضح (خطأ) على نافذتك
  4. قبض على عنصر نقرة / انقر نقرا مزدوجا في أيقونة علبة النظام
  5. في معالج أحداث أيقونة علبة النظام، إظهار الاتصال () أو محددة (TRUE) في نافذتك، وأخفي اختيار أيقونة الدرج الخاصة بك اختياريا.

نصائح أخرى

يساعد الرمز، حتى هنا شيء كتبته للحصول على تطبيق، باستثناء مؤشر الخطوف بدلا من الحدث التقليل.

ملاحظات:

"كأوضح (حدث (حدث)" هو حدث قابل للتجاوز QT، لذلك يجب وضعه في الفصل الذي ينفذ النافذة التي تريد إخفاءها.

"OKEYTOCLOSE ()" هي وظيفة قد تفكر في تنفيذ (أو علم منطقي قد ترغب في تخزينها) حيث ترغب في بعض الأحيان في الخروج من التطبيق بدلا من التقليل إلى Systray.

هناك أيضا مثال على كيفية إظهار () نافذتك مرة أخرى.

def __init__(self):
  traySignal = "activated(QSystemTrayIcon::ActivationReason)"
  QtCore.QObject.connect(self.trayIcon, QtCore.SIGNAL(traySignal), self.__icon_activated)

def closeEvent(self, event):
  if self.okayToClose(): 
    #user asked for exit
    self.trayIcon.hide()
    event.accept()
  else:
    #"minimize"
    self.hide()
    self.trayIcon.show() #thanks @mojo
    event.ignore()

def __icon_activated(self, reason):
  if reason == QtGui.QSystemTrayIcon.DoubleClick:
    self.show()

فقط لإضافة إلى المثال من قبل كريس:

فمن الأهمية بمكان أن تستخدم تدوين QT عند إعلان الإشارة، أي

صيح:

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.iconClicked)

وليس pyqt واحد

غير صحيح ولن تعمل:

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon.ActivationReason)"), self.iconClicked)

لاحظ ال :: في سلسلة إشارة. هذا أخذني حوالي ثلاث ساعات لمعرفة ذلك.

هنا رمز العمل .. شكرا ماتزي بالنسبة مهم, ، أخذت الإشارة لي ساعات أكثر من الفضول .. ولكن تفعل أشياء أخرى. لذلك تا ل #! الوقت الحاضر :-)

def create_sys_tray(self):
    self.sysTray = QtGui.QSystemTrayIcon(self)
    self.sysTray.setIcon( QtGui.QIcon('../images/corp/blip_32.png') )
    self.sysTray.setVisible(True)
    self.connect(self.sysTray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.on_sys_tray_activated)

    self.sysTrayMenu = QtGui.QMenu(self)
    act = self.sysTrayMenu.addAction("FOO")

def on_sys_tray_activated(self, reason):
    print "reason-=" , reason

كان هذا تحرير استجابة Vzades، لكن تم رفضه على عدد من الأسباب. يفعل الشيء نفسه بالضبط كعود كودها ولكنه أيضا يطيع أيضا الحد الأدنى للحدث (وتشغيله دون أخطاء بناء الجملة / الرموز المفقودة).

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        style = self.style()

        # Set the window and tray icon to something
        icon = style.standardIcon(QtGui.QStyle.SP_MediaSeekForward)
        self.tray_icon = QtGui.QSystemTrayIcon()
        self.tray_icon.setIcon(QtGui.QIcon(icon))
        self.setWindowIcon(QtGui.QIcon(icon))

        # Restore the window when the tray icon is double clicked.
        self.tray_icon.activated.connect(self.restore_window)

    def event(self, event):
        if (event.type() == QtCore.QEvent.WindowStateChange and 
                self.isMinimized()):
            # The window is already minimized at this point.  AFAIK,
            # there is no hook stop a minimize event. Instead,
            # removing the Qt.Tool flag should remove the window
            # from the taskbar.
            self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool)
            self.tray_icon.show()
            return True
        else:
            return super(Example, self).event(event)

    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(
            self,
            'Message',"Are you sure to quit?",
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
            QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.tray_icon.show()
            self.hide()
            event.ignore()

    def restore_window(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.tray_icon.hide()
            # self.showNormal will restore the window even if it was
            # minimized.
            self.showNormal()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

هذه هي الطريقة الصحيحة للتعامل مع النقر المزدوج على أيقونة صينية ل PYQT5.

def _create_tray(self):
    self.tray_icon = QSystemTrayIcon(self)
    self.tray_icon.activated.connect(self.__icon_activated)

def __icon_activated(self, reason):
    if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick):
        pass

هذا هو الكود وهو يساعدني في الاعتقاد في عرض لي الرمز

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QSystemTrayIcon


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.icon = QSystemTrayIcon()
        r = self.icon.isSystemTrayAvailable()
        print r
        self.icon.setIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.icon.show()
        # self.icon.setVisible(True)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.setWindowTitle('Message box')
        self.show()
        self.icon.activated.connect(self.activate)
        self.show()

    def closeEvent(self, event):

        reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes |
                                           QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.icon.show()

            self.hide()

            event.ignore()

    def activate(self, reason):
        print reason
        if reason == 2:
            self.show()

    def __icon_activated(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.show()


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top