QSettings

Alles rund um die Programmierung mit Qt
Antworten
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

QSettings

Beitrag von TK »

Hallo,

ich habe ein selbst geschriebenes tool, das zwei beliebige Dateien in eine Datei zusammenfasst und unter einem Pfad abspeichern lässt (Sinn sei jetzt mal dahingestellt), indem auf ein Button SPEICHERN geklickt wird. Ich möchte nun gerne das tool über die Konsole und einer setting-Datei bedienen. Am besten igendwie so:

myTool.exe myToolSettings.ini

In myToolSettings.ini stehen drei absolute Pfade, zwei für die Dateien, die zusammengefasst werden sollen, einer für den Speicherort. Wie ist das möglich?
Also QSettings behersche ich schon etwas (kann die Eingabe der drei Pfade des tools über die Settings.ini setzen), aber wie funtioniert das über die Konsole. Und, wie "betätige" ich über die Konsole den Button SPEICHERN?

Danke für irgendwelche Hinweise.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QSettings

Beitrag von franzf »

TK hat geschrieben:aber wie funtioniert das über die Konsole.
Beschäftige dich mit den Parametern von main() (also argc und argv; da stehen die cmdline-args drin)
Und, wie "betätige" ich über die Konsole den Button SPEICHERN?
Du hast mit GUI-Programmen angefangen, richtig? Nie mit Konsolenprogrammen rumgespielt?
Du solltest hier nämlich gar keinen Dialog aufpoppen lassen, sondern nur nen Prompt "Jetzt speichern?" auf die Konsole bringen + Userinput abwarten (return, 'y'+return o.Ä.).
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Re: QSettings

Beitrag von TK »

Hallo franzf,

danke für die Infos. Das mit dem Argumentenzähler (argc) und die Liste der Argumente (argv) funktioniert. Doch wie gebe ich eine Ausgabe in der Eingabeaufforderung aus?
Ich habe folgenden code:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello world!" << endl;

    QApplication a(argc, argv);
    mainWindow w;
    w.show();
    return a.exec();
}
Das Hello world ist zwar im QTCreator unter Application output zu sehen, doch wenn ich das Programm in der Eingabeaufforderung starte kommt keine Ausgabe.
Was ist hier bei zu beachten? Danke!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QSettings

Beitrag von Christian81 »

Welches Betriebssystem?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Re: QSettings

Beitrag von TK »

@Christian81: XP
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QSettings

Beitrag von Christian81 »

Ohne genauer darauf einzugehen warum: http://doc.trolltech.com/4.7/qmake-vari ... tml#config und dort die Option 'console'
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Re: QSettings

Beitrag von TK »

Also, soviel wie ich jetzt gelesen habe verstehe ich das so: Wenn ich eine Gui mit QApplication habe bekomme ich keine Konsolenausgabe hin. Also müsste ich eine QCoreApplication schreiben in der, je nach Argument, meine Gui gestartet (über QProcess) wird oder in der Konsole bleibt. Richtiger/besserer Ansatz?
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Re: QSettings

Beitrag von TK »

Hm, so geht's nun doch:

Code: Alles auswählen

TARGET = t1
TEMPLATE = app

CONFIG += console

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    cout << "Hello wordl1!" << endl;
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
Hat da jemand was einzuwenden?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QSettings

Beitrag von franzf »

Deine Anforderungen "Gui Tool + dieses per cmd.exe steuern" beißen sich. Entweder hast du eine GUI oder ein Konsolenprogramm.
Ich würde zwei Versionen anbieten - "mytool.exe" und "mytoolgui.exe". Gemeinsame Teile lagerst du in ne shared library aus. Wenn ich ein Programm starte und das Programm eine GUI aufpoppen lässt (nochdazu mit allen Bedienelementen) es dann aber erwartet dass ich es per Konsole bedien - Ich würd umkippen...
Da es sich hierbei sowieso um einen Converter handelt, der eigentlich gar keine GUI braucht, würde ich erst gar nicht auf die Idee kommen, es über eine GUI zu realisieren (OK, Filedialoge sind nett, aber sicher nicht so schnell wie Autovervollständiguzng in der Konsole).

Insbesondere würde ich niemals eine GUI von einer Konsolenanwendung heraus per QProcess starten, um dann die GUI bedienen zu wollen. Andersherum ginge es sehr wohl - die GUI startet per QProcess den Converter, wenn du aber die Fäden selber in der Hand hältst würde ich den Weg wie oben beschrieben über die Shared Library gehen.
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Re: QSettings

Beitrag von TK »

"Entweder hast du eine GUI oder ein Konsolenprogramm."
Es gibt doch sehr viele Programme die beide Möglichkeiten anbieten, über eine *.exe

Eine GUI besteht schon. Nun möchte ich das tool auch über die Konsole bedienen können. Hintergrund ist, damit das tool in einem automatischen Prozess eingefügt werden kann.

Eine Lösung wäre nun:

Code: Alles auswählen

if (Argument GUI)
{
 //starte GUI
}
else if (Argument non-GUI)
{
 // benutze gemeinsame Funktionen, Konsolenausgabe
}
else
{
 // falsches Argument, nop
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QSettings

Beitrag von franzf »

Klar geht das. Sei dir aber im klaren darüber, dass du in einer non-Gui-Umgebung keine QApplication oder QWidgets erstellen kannst - gibt nen runtime-Fehler. Dann musst du in deiner main() je nach argv eine QCoreApplication oder eine QApplication erstellen.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QSettings

Beitrag von RHBaum »

Ui Ui Ui Leute ....

windows:
Wenn Du die GDI.lib linkst, hasst Zugriff auf die graphischen funktionen der winapi und kannst lustig aufm Bildschirm rummalen. Unabhaengig davon was fuer ein Programm hasst.
Wird dein programm zusammen mit ner "konsole" gestartet, und die FileDescriptoren ordnungsgemaess umgelenkt, kannst du auf diese Konsole schreiben ... Unabhaengig davon was fuer ein Programm hasst.

Mann kann auch beides, ohne Probleme.
Wie gesagt GUI bekommt man durch linken von GDI.lib (die schiesst auf die gdi.dll) und konsorten. Alle weiteren Aufsaetze, ala QTGUI setzen das halt vorraus.
"Problem" ist eher, das nen GUI Programm zwingen ne Eventloop vorraussetzt, in ner Konsolen App hat man das weniger, geht aber auch.

Ob du ne Konsole zum Programm startest, bestimmt windows normal anhand eines Flags im execution header. Das wiederum setzt ueber ne linkeroption ! ("+Console" im qmake setzt das z.b.)

Du kannst frisch und munter und putzig mischen, weil das eigentlich 2 vollig voneinander unterschiedliche Dinge sind, die sich nicht beeinflussen.

Ob es Sinnn macht, iss ne andere Frage ... aber jedem Tierchen sein ... Ihr wisst scho.
Am Ende hasst halt ne Konsolenanwendung, die ne komplette windows GUI version inklusive MsgLoop im codesegment mit rumschleppt, von zig libs abhaengigi ist, den User Graue Haare bringt und 20 Bestaetigungen beim Installieren der Abhaengigkeiten abverlangt , und dann nix davon nutzt ... Aber wenn das gewollt ist !?

professionelle Code wiederVerwertung sieht IMHO eh anders aus:
Alles was man gemeinsam verwendet -> lib(am besten dll) auslagern.
- Console Anwendung mit minimalen Abhaengigkeiten (lib dazugelinkt)
- Qt Variante (lib dazugelinkt)
- Curses version (konsolen grafik, for komfortable nutzung, aber ohne XServer zu haben, in ssh sessions z.b.)
- Andere varianten (vielleicht wenn mal keine QT hasst, ne GTK version, oder wxwidgets, wenn nie was anderes brauchst, auch ok ^^).

Unter windows ist halt der leidensdruck ned soo gross, weil da installiert eh jeder Popel 25 Sonderversionen irgendeiner Lib die er meinte unbedingt verwenden zu muessen.
Von daher iss es auch gang und gaebe, admin rechte anzufragen fuer jedes ....

Unter linux siehts bissi anders aus z.b. Wer mit Gnome arbeitet, mag ned gern aufn QT Programm gezwungen werden. Ohne Konfigurationsaufwand sieht QT unter gnome auch ausgesprochen .... aus.

Ciao ...
Antworten