C++ [Qt]Programm ohne sichtbares Fenster

JetStre4m

Lieutenant
Registriert
Nov. 2007
Beiträge
578
Hallo, ich versuche gerade in Qt ein Programm ohne sichtbares Fenster zu erstellen, das nur über ein Icon im System-Tray zu erreichen ist. Ich habe bis jetzt einfach ein QWidget erzeugt, dass ein QSystemTrayIcon enthält und davon ein Objekt angelegt ohne hinterher die show()-Methode aufzurufen, so funktioniert das Ganze auch.
Aber wenn ich in einem Slot einen Klick auf das Tray-Icon verarbeite und dazu einen eigenen Dialog aufrufe, Beendet sich das Gesamte Programm nach Ausführung desselben.

Hier mal der Code:

Code:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow();
    ~MainWindow();
private:
    QSystemTrayIcon* icon;
public slots:
    void trayIconClicked(QSystemTrayIcon::ActivationReason);
};

#endif // MAINWINDOW_H
Code:
//mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow()

{
    icon=new QSystemTrayIcon(QIcon("Icon.png"));
    icon->show();

    connect(icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,
            SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason)));
}

void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
    if(reason==QSystemTrayIcon::Trigger)
    {
        QMessageBox::information(this, "Klick", "Viele wichtige Sachen", QMessageBox::Ok); 
         //An dieser stelle Beendet sich das Programm, wenn die show()-Funktion nicht aufgerufen wurde
    }
}

MainWindow::~MainWindow()
{
}
Code:
//main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow* w=new MainWindow();
    //w->show();   <-- Auskommentiert, damit kein Fenster angezeigt wird
    return a.exec();
}

Was mache ich falsch, oder wie lässt sich das Ganze eleganter lösen?
 
Also ich kenn mich bei Qt nicht aus. Aber ich kann dir nur sagen, dass du gar kein window erzeugen musst, wenn du es nicht anzeigen lässt. Das würde nur unnötig Systemressourcen benötigen. (Auch wenn das bei High-End-PC's oft vernachlässigt wird!)
 
Mich verwundert etwas, wie du MainWindow erstellst, ob es daran liegt, kann ich dir nicht sagen, aber versuche doch mal statt MainWindow* w=new MainWindow();
MainWindow w;
Und dann auch beim Konstruktor:
MainWindow(QWidget *parent = 0);

Ich tippe einfach mal auf den Konstruktor.


Gruß,

badday
 
@badday: Das Problem bleibt trotzdem bestehen...
@problemlöser: Ich brauche ja trotzdem eine Klasse die die Signale und Slots der einzelnen Widgets verwaltet, z.B. eben vom QTrayIcon und dafür hab ich mir halt eine von QWidget abgeleitet
 
Ich habe das eben ausprobiert, bei mir funktioniert es so wie ich dachte:
Code:
//mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QWidget(parent)

{
    icon=new QSystemTrayIcon(QIcon("Icon.png"));
    icon->show();

    connect(icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,
            SLOT(trayIconClicked(QSystemTrayIcon::ActivationReason)));
}

void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason)
{
    if(reason==QSystemTrayIcon::Trigger)
    {
        QMessageBox::information(this, "Klick", "Viele wichtige Sachen", QMessageBox::Ok);
     
    }
}

MainWindow::~MainWindow()
{
}

Code:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent=0);
    ~MainWindow();
private:
    QSystemTrayIcon* icon;
public slots:
    void trayIconClicked(QSystemTrayIcon::ActivationReason);
};

#endif // MAINWINDOW_H


Code:
//main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    //w->show();   <-- Auskommentiert, damit kein Fenster angezeigt wird
    return a.exec();
}

Sollte gehen,



Gruß,

badday
 
Hm, bei mir funktioniert das ganze immer noch nicht. Wen du bei dir auf das Icon geklickt hast und der Dialog erscheint, beendet sich das Programm dann nicht wenn du auf OK geklickt hast?
 
Ich habe den Fehler:
a.setQuitOnLastWindowClosed(false);
in main.cpp.

Gruß,

badday
 

Ähnliche Themen

Zurück
Oben