2015-06-07 12 views
5

udało mi się uzyskać QSystemTrayIcon widoczny podobny do tego:Pokaż QWidget lub QWindow blisko QSystemTrayIcon w QT C++

Assume that the VMWare icon is my QSystemTrayIcon

stosując następujący wiersz kodu (z gniazd sygnałowych robocza):

#include "dialog.h" 
#include "ui_dialog.h" 
#include <QMessageBox> 
#include <form.h> 

Dialog::Dialog(QWidget *parent) 
    : QDialog(parent), ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 

    QIcon icon("/Users/JohnnyAppleseed/IMAGE.png"); 
    m_ptrTrayIcon = new QSystemTrayIcon(icon); 
    m_ptrTrayIcon->setToolTip(tr("Bubble Message")); 
    // m_ptrTrayIcon->setContextMenu(m_trayIconMenu); 
    connect(m_ptrTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), 
       this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

Jednak, gdy próbuję zaimplementować kod, aby pokazać QWidget/QWindow w pobliżu utworzonego przeze mnie QSystemTrayIcon, nie pojawi się on w pobliżu. Pokazuje również, i szybko znika, jak również (nawet jeśli nie chcą go w pobliżu QSystemTrayIcon) przy użyciu tego kodu:

void Dialog::iconActivated(QSystemTrayIcon::ActivationReason reason) 
{ 
    form fr; 
    fr.setWindowFlags(Qt::Popup); 

    fr.show(); 
} 

Dla bytu jasne, chciałbym pokazać moją QWidget/QWindow tylko jak podejście VMware Fusion (lub zegar, który znajduje się na Microsoft Windows Vista lub później ...)

Mac OS X/Linux No description

Microsoft Windows enter image description here

Czy ktoś może wskazać, co robię źle? Dzięki!

Żeby było znacznie prostsze, ściągnąć projekt: http://zipshare.net/sv

Aktualizacja # 1

Odnośnie kwestii QWidget/QWindow flicking, vahancho poradził mi, aby przesunąć form fr; z funkcji void Dialog::iconActivated(QSystemTrayIcon::ActivationReason reason) do nagłówek okna roboczego. I wszystko zadziałało pomyślnie dzięki vahancho. Okno pokazuje się teraz, ale nie znajduje się już blisko QSystemTrayIcon :(

Odpowiedz

1

Problem polega na tym, że tworzysz obiekt w stosie, który zostanie usunięty, gdy tylko zniknie z niego okno iconActivated(). Dlatego znika tak szybko, jak to zobaczyć. aby rozwiązać ten problem, czego potrzeba, aby stworzyć swój pop-up w stercie.

UPDATE

w celu wy dialogowe obok ikony w zasobniku trzeba umieścić określ pozycję ikony tacki, aby to zrobić, możesz użyć funkcji QSystemTrayIcon :: geometry(). Twój kod będzie wyglądał (dopasuj współrzędne do twoich potrzeb):

QRect rect = m_ptrTrayIcon->geometry(); 
fr.move(rect.x(), rect.y()); 
fr.show(); 
+0

Dzięki za wskazanie przyczyny zniknięcia symbolu QDialog! Udało mi się to naprawić, deklarując "fr" z pliku HEADER zamiast deklarując go wewnątrz ikonyActivated(). Ale głównym problemem jest to, że nie mogę znaleźć żadnego rozwiązania dla utrzymania QDialog w pobliżu QSystemTrayIcon ... – user3188609

+0

Proszę spojrzeć na moją zaktualizowaną odpowiedź. – vahancho

+0

Działa jak urok! Dzięki vahancho: D – user3188609