QSystemTrayIcon und Mouseover

Alles rund um die Programmierung mit Qt
Antworten
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

QSystemTrayIcon und Mouseover

Beitrag von curator »

Hallo,

ich habe ein kleines Programmzusammengesteckt.

Dazu habe ich eine Klasse von QSystemTrayIcon abgeleitet --> foo.c, foo.cpp

Ziel der Sache ist, dass ein TrayIcon unabhängit läuft, MessageIO über Ballons und Steuerung über das Context Menu.

Grundsätzlich geht das auch hervorragend:

Code: Alles auswählen

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

     if (!QSystemTrayIcon::isSystemTrayAvailable()) {
         QMessageBox::critical(0, QObject::tr("Systray"),
                               QObject::tr("I couldn't detect any system tray "
                                           "on this system."));
         return 1;
     }
	
	foo foo;
	foo.show();
	return app.exec();

}
So, der constructor:

Code: Alles auswählen

foo::foo()
{
	m_IconMessage	=	new QIcon("Message.gif");

	// Create Tray
	m_ShowStatus	= new QAction(tr("Show Status"), this);
	m_Quit		= new QAction(tr("Quit"), this);

	connect(m_ShowStatus,	SIGNAL(triggered()), this, SLOT(onCmdShowStatus())	);
	connect(m_Quit,			SIGNAL(triggered()), qApp, SLOT(quit()));

	m_TrayIconMenu = new QMenu();
	m_TrayIconMenu->addAction(m_ShowStatus);
	m_TrayIconMenu->addSeparator();
	m_TrayIconMenu->addAction(m_Quit);

	setContextMenu(m_TrayIconMenu);

	setIcon(*m_IconMessage);
}
Der eigentlich ShowStatus ist abschließend der hier

Code: Alles auswählen

void foo::onCmdShowStatus()
{
	QString p_StatusText = "uhaha";

	QTextEdit *p_Status = new QTextEdit();
	p_Status->setParent(NULL);
	p_Status->setFont(QFont("Courier",12));
	p_Status->setText(p_StatusText);
	p_Status->setReadOnly(true);
	p_Status->show();
	p_Status->setGeometry(100, 100, 1200, 600);

}
So, erstmal genung Code. Also der öffnet das Fenster kommentarlos, Ausgabe ist korrekt. Nur, wenn ich das Fenster "x" schließe, geht mir die gesammte qApp weg. Wenn ich allerding das Fenster 2x aufmache, und die dann schließe, dann bleibt das Fenster stehen. Jemand eine Idee, wo da mein Denkfehler ist? foo ist doch kein child von QtextEdit, warum zerstört der den aber dann?

2. Frage: Die kann ich kein einem QSystemTrayIcon eine "relative Uhr" realisieren? Ich kann (von woanders) im Moment einen Timer starten, der der ändert jede Sekunde das Tooltip des TrayIcon auf die akutelle Zeit. Effizienter wäre aber, wenn ich den Tooltipp der onDemand, also onMouseOver schreibe. Aber wie merke ich das (welches Signal)? Schön wäre auch, wenn die Uhr weiterläuft, während die Maus auf dem Icon steht.

Code: Alles auswählen

void foo::onCmdSetTimer(int i_Minutes)
{
	connect(m_Timer,	SIGNAL(timeout()), this, SLOT(onCmdTimerEvent())	);
	m_Timer->start(1000);
	m_StartTime = QTime::currentTime();
	m_TimerMinutes = i_Minutes;
	
}

void foo::onCmdTimerEvent()
{
	QTime		p_CurrentTime	= QTime::currentTime();
	p_CurrentTime				= m_StartTime.addSecs(-p_CurrentTime.second()-p_CurrentTime.minute()*60-p_CurrentTime.hour()*60*60);
	p_CurrentTime				= p_CurrentTime.addSecs(m_TimerMinutes*60);
	QString		p_Text			= p_CurrentTime.toString("hh:mm:ss");

	this->setToolTip(p_Text);
}
Wäre Super, wenn mir jemand bei einer der beiden Probleme helfen kann

Gruß,
curator
Zuletzt geändert von curator am 29. Juli 2011 09:40, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QTextBoxes mit QSystemTrayIcon

Beitrag von Christian81 »

Ich schätze mal das ist der Grund: http://doc.trolltech.com/4.7/qapplicati ... losed-prop
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Re: QTextBoxes mit QSystemTrayIcon

Beitrag von curator »

Was soll ich sagen: Gewusst wo man suchen muss!

Diese Zeile:
app.setQuitOnLastWindowClosed(false);

löst das Problem mit dem closed Window. Danke dafür.

Hat jemand vielleicht eine Idee zu dem MouseOver Problem mit dem Tooltip?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: [partly solved]QTextBoxes mit QSystemTrayIcon und Mouseo

Beitrag von archer »

QObject::event ( QEvent * e ) und QEvent::ToolTip
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Re: [partly solved]QTextBoxes mit QSystemTrayIcon und Mouseo

Beitrag von curator »

Gibt es dafür nen Link oder ein Beispiel?
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Re: QSystemTrayIcon und Mouseover

Beitrag von curator »

Also ich hab noch einmal geschaut.
Ich habe jetzt event() reimplementiert. Und zwar so:

Code: Alles auswählen

bool foo::event( QEvent *event )
{
	printf("%d\n",event->type());
	return QSystemTrayIcon::event( event );  
	}
}
Also theoretisch müsste da doch jetzt was passieren. Der spuckt auch events aus, aber nur child create, status tip und sowas.

Auf "MouseOver" auf dem Tray reagiert er aber leider nicht mir einer Ausgabe, daher kann ich auch nicht auf ein Event reagieren.

Oder hab ich das falsch verstanden? Kann es sein, dass das "so" nur bei "normalen" widgets gehts?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: QSystemTrayIcon und Mouseover

Beitrag von archer »

Ich dachte dein Problem ist das du den Tooltip nicht ständig über einen QTimer aktualisieren willst, sondern nur wenn dieser angezeigt wird.
Und da dachte ich du kannst z.B. das ToolTip-Event verwenden um diesen zu aktualisieren.
Aber wenn du MouseOver suchst solltest du dich wohl eher an den Events Enter, Leave und MouseMove orientieren.
Dazu Dokumentation lesen.
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Re: QSystemTrayIcon und Mouseover

Beitrag von curator »

Hallo, danke für die Gedult. In der Doku habe ich leider schon viel gelesen, das aber nicht herausgefunden.

Wenn ich mit der Maus über das Icon fahre, dann geht der Tooltip auf. Mit einem Timer setze ich derzeit den Wert des Tooltip`s auf meine Zeit.

Ich habe das event() wie oben beschrieben reimplementiert. Was ich sagen wollte ist: Wenn ich mit der Maus über das Icon fahre, dann wird zwar der Tooltip ausgelöst (d.h. die vom Timer gesetzte Zeit angezeigt), die event Routine wird aber nicht aufgerufen. (Siehe printf()).

Also wird der tooltip zwar angezeigt, aber das event nicht ausgelöst ( oder versuche es falsch zu fangen). Andere Events (wie create child oder so) zeigt der an.

Hoffe jetzt ist mein Problem klarer.
Antworten