staging.inyokaproject.org

qt-program-starter

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Ich glaube wir reden alle aneinander vorbei...
Ich möchte dass eine Konfig-Datei mit vorgegebenen Standardeinstellungen erstellt wird, welche ein Anwender dann ändern kann (also zu seinen eigenen Standardeinstellungen machen kann), ohne dass jede Einstellung beim Beenden des Programms gespeichert wird.

BodomBeachTerror

Anmeldungsdatum:
24. März 2008

Beiträge: 788

Achso^^

Das musst du denn denke ich selbst machen. Aber wozu willts du das denn machen? Er kann es doch einfach einstellen wie er es haben will, er braucht doch keine Standardeinstellungen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@hakaishi: Jetzt komme ich nicht mehr mit … „Standardeinstellungen“ impliziert, dass es noch eine zweite Datei gibt, in der der Benutzer nochmal was ändern kann?!

Ich glaube, wir sollten nochmal von vorne anfangen: Beschreibe nochmal vollkommen von vorne (und zwar ohne konkrete Benutzung einer Klasse), wie und wann Dein Programm Einstellungen lesen und schreiben muss, und wie der Benutzer diese Einstellungen verändern soll.

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

BodomBeachTerror schrieb:

Achso^^

Das musst du denn denke ich selbst machen. Aber wozu willts du das denn machen? Er kann es doch einfach einstellen wie er es haben will, er braucht doch keine Standardeinstellungen.

Geschmacksache ^^
Wenn man nicht will das alles was man verändert gespeichert wird, aber dennoch eine bestimmte Einstellung haben möchte, ist das halt so 'ne Sache... (die ich dem Anwender selbst überlassen möchte)

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Lunar schrieb:

Um eine bereits laufende Anwendung zu kontrollieren, musst Du in dieser Anwendung Objekte über D-Bus exportieren. Wenn Du feststellst, dass die Anwendung bereits läuft, greifst Du über D-Bus auf ein solches Objekt zu, dass entsprechende Methoden zur Kontrolle der Anwendung anbietet.

Wenn ich das richtig verstanden habe, kann ich ein Objekt der Anwendung exportieren, sodass ich über D-Bus "show()" aufrufen kann. Ist das so richtig?
Ich habe folgendes probiert (was allerdings nicht funktioniert, aber auch keine Fehlermeldung ausgibt):

in (ehem.) window.cpp:

1
QDBusConnection::sessionBus().registerObject("/org/qt_program_starter", this, QDBusConnection::ExportAllSlots);

in main.cpp:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
if(QDBusConnection::sessionBus().registerService("org.qt_program_starter")){
//if possible register qt-program-starter as a service in the session bus
  Gui window;
  window.loadSettings();
  window.show();
  return app.exec();
}
else{ //if registering qt-shutdown-p fails (also because it is already
      // registered, show window
  QDBusInterface qtProgramStarter("org.qt_program_starter",
  "/org/qt_program_starter", "org.qt_program_starter",
  QDBusConnection::sessionBus());
  qtProgramStarter.call("show");
}

Ich glaube ich habe was vergessen, oder ich mache irgendetwas falsch...

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Fehlermeldungen kann das gar nicht ausgeben, denn Du prüfst nirgendwo Fehler. Funktionieren wird das aber wohl auch nicht, denn Du hast – zumindest so wie gezeigt – keine D-Bus-Schnittstelle für Deine Klasse gesetzt, aber versuchst, auf die Methode mit der Angabe einer D-Bus-Schnittstelle zuzugreifen. Lies in der Dokumentation nach, wie Du die D-Bus-Schnittstelle für eine Qt-Klasse bestimmen kannst.

Desweiteren reicht der Aufruf von .show() nicht. Diese Methode sorgt nur dafür, dass das Fenster überhaupt angezeigt wird (was eh schon der Fall ist). Du musst .raise() aufrufen, um das Fenster in den Vordergrund zu holen, und .activateWindow(), um das Fenster zu aktivieren. Da letztere Methode kein Slot ist, kannst Du sich nicht einfach so exportieren, sondern musst entweder einen zusätzlichen Slot implementieren, oder einen Adapter schreiben.

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Ich bin da auf seltsame Probleme gestoßen:
Wenn das Programm minimiert ist und ich raise() und setWindowState(Qt::WindowActive) aufrufen lasse, tritt es zwar in Vordergrund, aber es ist nicht aktiv; Wenn es dagegen nur im Hintergrund ist, passiert gar nichts...
Wenn das Programm minimiert ist und ich setWindowState(Qt:WindowNoState) aufrufen lasse, wird das Programm gezeigt und ist aktiv, allerdings passiert nichts, wenn die Funktion aufgerufen wird und das Programm unter einem anderen Fenster ist. Wenn ich dann die Funktion raise() hinzufüge, zeigt sich das Programm ist jedoch inaktiv. Wenn ich zusätzlich setWindowState(Qt::WindowActive) anhänge, funktioniert wieder beides nicht mehr richtig...
Nicht einmal mit showNormal() und ähnlichen Anderen wie activateWindow() geht das... Selbst wenn ich die zwei setWindowState()-Funktionen zu setWindowState(Qt::WindowActive | Qt:WindowNoState) kombiniere ...
Vielleicht ist das ganze ja auch nur bei mir mit Ubuntu Karmic + QT 4.5.2 so... (Bei qt-shutdown-p ist mir das übrigens auch schon aufgefallen. Dort aktiviert sich das Fenster erst, wenn die Methode aufgrund des timeouts eines Timers ein zweites mal aufgerufen wird.)

Gruß, Hakaishi

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

ANMERKUNG: Die Probleme treten nur Programm intern auf, d.h. mit Maus und Tastatur lässt sich alles problemlos aktivieren, wiederherstellen und in den Vordergrund holen etc...
Um das Problem zu lösen habe ich die Befehle gegeneinander abgegrenzt:

1
2
3
4
5
6
if(isMinimized() || isHidden())
  showNormal();
else{
  activateWindow();
  raise();
}

Allerdings ist mir jetzt etwas anderes aufgefallen:
Wenn ich nach dem Programmstart nur minimiere und wiederherstelle, dann ist alles bestens. Sobald das Programmfenster allerdings von einem Anderen überdeckt wird oder hide() ausgeführt wurde, lässt es sich bis zum Programmneustart nur noch aktivieren, wenn das Fenster überdeckt wurde.
Wenn ich activateWindow() nach raise() setze, wird das Programmfenster nicht nach vorne geholt.

Gruß, Hakaishi

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Hier gibt es jetzt die neuen Pakete.
Und hier den neuen Source-Code.

Es gab einige Veränderungen -^_^-
Unter anderem habe ich die multiple start prevention wieder ausgebaut, damit sich das Programm z.B. auch selbst aufrufen kann. Ich hoffe es gefällt euch.

Edit: Mist, scheint als hätte ich doch noch ein zwei Dinge aus zu bügeln...

Gruß, Hakaishi

Bilder

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Hier die gefixten Pakete und Source.

Gruß, Hakaishi

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Ich habe noch einen Weiteren Bug gefunden. Wenn beide Textfelder leer sind und OK geklickt wird, gibt es einen Segmentation fault und das Programm lässt drei Objekte deaktiviert (das Problem ist bereits behoben).

Hier gibt es noch mal die neue Source. Wo man die Pakete herbekommt habe ich ja bereits erwähnt.

Gruß, Hakaishi

hakaishi

(Themenstarter)
Avatar von hakaishi

Anmeldungsdatum:
28. April 2008

Beiträge: 525

Das Programm wurde jetzt nach qprogram-starter umbenannt und ist bereits in dem Debian unstable Archiv. Für mehr Informationen: http://packages.qa.debian.org/s/shutdown-qapps.html

Demnach wird es voraussichtlich mit lucid+1 nach Ubuntu gelangen (hoffe ich). An dem Programm wurde noch einiges verbessert. Viel Spaß damit


Gruß, Hakaishi

Antworten |