Innerhalb QT .exe mit Argumenten Ausfuehren
-
Danke JonB, durch den Debug kam nach einer kleinen Wartezeit:
false "\r\ncan't open file 'Logo'\r\n\r\nError code -1\r\nDr\x81""cken Sie eine beliebige Taste . . . " "" QProcess: Destroyed while process ("PATH\LogoCompiler.exe") is still running.
Ah, dann muss mir hier noch etwas fehlen, "Logo" soll die eingelesene .bmp "logo_bitmap" sein => QFile Logo(logo_bitmap),
diese soll dann im Process zur .bin Datei "logo_binary" werden.Und ganz unten soll diese dann zu Logo_Bin werden. QFile Logo_Bin(logo_binary);
(das letztere sollte man sich normalerweise sparen können...)QFile::remove() löscht mir ebenfalls im nachhinein nicht die kopierte Datei?
void MainWindow::on_actionLoad_Logo_Bitmap_triggered() { QString filter = "Logo File (*.bmp)"; logo_bitmap = QFileDialog::getOpenFileName(this, "Select the Logo .bmp file", "PATH",filter); logo_name = logo_bitmap.split("/")[3]; QFile Logo(logo_bitmap); if (!Logo.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this,"Error","Bitmap not opened"); } else { ui->lineLogo->setText(logo_name); ui->label->setText("Logo to be used, is Selected!"); } QPixmap p(logo_bitmap); if (! ui->graphicsView->scene()) { //qDebug() << "No Scene!"; QGraphicsScene *scene = new QGraphicsScene(this); ui->graphicsView->setScene(scene); } ui->graphicsView->scene()->addPixmap(p); //Convert QFile Logo to .bin File (named: logo_binary (String)) Using: bmp2c-escher3d.exe testbmp.bmp testimage.bin -b -c QFile::copy(":/rec/Software/bmp2c-escher3d.exe", "PATH/LogoCompiler.exe"); QProcess proc; proc.start("PATH/LogoCompiler.exe", { "Logo", "logo_binary", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); QFile Logo_Bin(logo_binary); //QFile::remove("PATH/LogoCompiler.exe");
habe nun ebenfalls probiert ob ich die source bitmap vorher in den resource Ordner Kopiere..(und dann nach getaner arbeit wieder lösche) leider macht er mir das so nicht.
auch nicht unter Angabe des direkten Dateipfades, kann man So überhaupt in den resource Ordner kopieren?QString filter = "Logo File (*.bmp)"; logo_bitmap = QFileDialog::getOpenFileName(this, "Select the Logo .bmp file", "PATH",filter); QFile::copy(logo_bitmap, ":/rec/Images/SourceLogo.bmp");
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
QFile::remove() löscht mir ebenfalls im nachhinein nicht die kopierte Datei?
In dem ursprünglichen Fall kann es (unter Windows) nicht funktionieren. Mit startDetached() kehrt der Funktionsaufruf direkt wieder zurück und die Datei kann nicht gelöscht werden, weil sie noch in Benutzung ist. Generell würde es sich daher anbieten das Signal QProcess::finished mit dem Löschen der Datei zu verbinden. Dann sollte hoffentlich die Datei auch wieder von Windows freigegeben worden sein. Sonst vielleicht zusätlich einen Timer von 1 Sekunde setzen, bevor die Datei gelöscht wird. (Andere Betriebssysteme erlauben das Löschen der Datei, während sie noch geöffnet ist. Die Datei ist dann sofort nicht mehr im Dateisystem sichtbar, wird physisch aber erst gelöscht, wenn sie nicht mehr geöffnet ist.)
-
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
QFile::remove() löscht mir ebenfalls im nachhinein nicht die kopierte Datei?
In dem ursprünglichen Fall kann es (unter Windows) nicht funktionieren. Mit startDetached() kehrt der Funktionsaufruf direkt wieder zurück und die Datei kann nicht gelöscht werden, weil sie noch in Benutzung ist. Generell würde es sich daher anbieten das Signal QProcess::finished mit dem Löschen der Datei zu verbinden. Dann sollte hoffentlich die Datei auch wieder von Windows freigegeben worden sein. Sonst vielleicht zusätlich einen Timer von 1 Sekunde setzen, bevor die Datei gelöscht wird. (Andere Betriebssysteme erlauben das Löschen der Datei, während sie noch geöffnet ist. Die Datei ist dann sofort nicht mehr im Dateisystem sichtbar, wird physisch aber erst gelöscht, wenn sie nicht mehr geöffnet ist.)
@SimonSchroeder
Ich verstehe nicht. Jetzt hat er:proc.start("PATH/LogoCompiler.exe", { "PATH/SourceLogo.bmp", "PATH/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished();
Dass ist warum ich habe ihm diesen Code gegeben, einfach zu sein. Also kein
startDetached()
, undwaitForFinished()
vor dem Löschen? Aber mein Deutsch is nicht perfekt :) -
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
QFile::remove() löscht mir ebenfalls im nachhinein nicht die kopierte Datei?
In dem ursprünglichen Fall kann es (unter Windows) nicht funktionieren. Mit startDetached() kehrt der Funktionsaufruf direkt wieder zurück und die Datei kann nicht gelöscht werden, weil sie noch in Benutzung ist. Generell würde es sich daher anbieten das Signal QProcess::finished mit dem Löschen der Datei zu verbinden. Dann sollte hoffentlich die Datei auch wieder von Windows freigegeben worden sein. Sonst vielleicht zusätlich einen Timer von 1 Sekunde setzen, bevor die Datei gelöscht wird. (Andere Betriebssysteme erlauben das Löschen der Datei, während sie noch geöffnet ist. Die Datei ist dann sofort nicht mehr im Dateisystem sichtbar, wird physisch aber erst gelöscht, wenn sie nicht mehr geöffnet ist.)
JonB hat hier recht, startDetached gibt es hier nicht mehr!
nurnoch:QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/PanelDueLogoCompiler.exe"); QProcess proc; proc.start(work_path+"/PanelDueLogoCompiler.exe", { "D:/Privat/Eigene Bilder/SourceLogo.bmp", work_path+"/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin");
Habe wiegesagt unter QFile noch nichts gefunden das mir ein File direkt
ohne Dialog laedt.
das funktioniert nicht:QFile::open(this, work_path+"/SourceLogo.bin");
-
JonB hat hier recht, startDetached gibt es hier nicht mehr!
nurnoch:QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/PanelDueLogoCompiler.exe"); QProcess proc; proc.start(work_path+"/PanelDueLogoCompiler.exe", { "D:/Privat/Eigene Bilder/SourceLogo.bmp", work_path+"/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin");
Habe wiegesagt unter QFile noch nichts gefunden das mir ein File direkt
ohne Dialog laedt.
das funktioniert nicht:QFile::open(this, work_path+"/SourceLogo.bin");
@NeueKlasse
Das sollte funktionieren, wenn Sie es nachwaitForFinished()
ruefen. Aber Versuchen Sie Folgendes:proc.close(); QFile::remove();
Unter Windows kann es auch sein, dass ein Virenscanner stört. Möglicherweise müssen Sie eine Verzögerung verwenden (
QTimer
).QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt");
Funktioniert das? Funktioniert das mit
.exe
anstatt.txt
? -
@NeueKlasse
Das sollte funktionieren, wenn Sie es nachwaitForFinished()
ruefen. Aber Versuchen Sie Folgendes:proc.close(); QFile::remove();
Unter Windows kann es auch sein, dass ein Virenscanner stört. Möglicherweise müssen Sie eine Verzögerung verwenden (
QTimer
).QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt");
Funktioniert das? Funktioniert das mit
.exe
anstatt.txt
?proc.close(); zusaetzlich bringt keinen erfolg
statt .bin, .txt ist ebenfalls ohne Aenderung...
Virensoftware (Kaspersky) geschlossen, gleiches Problem!
-
proc.close(); zusaetzlich bringt keinen erfolg
statt .bin, .txt ist ebenfalls ohne Aenderung...
Virensoftware (Kaspersky) geschlossen, gleiches Problem!
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt");
Nur das (kein
QProcess
) funktioniert nicht? Wie wissen Sie das? WeilFile.txt
existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?QFile::remove()
gibt einen Wert zurück:qDebug() << QFile::remove(work_path+"/File.txt");
-
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt");
Nur das (kein
QProcess
) funktioniert nicht? Wie wissen Sie das? WeilFile.txt
existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?QFile::remove()
gibt einen Wert zurück:qDebug() << QFile::remove(work_path+"/File.txt");
@JonB
so sieht es nun aus:Erster Schritt: beim/nach dem Laden des .bmp Pictures wird nachfolgendes ausgefuehrt:
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/Compiler.exe"); QProcess proc; proc.start(work_path+"/Compiler.exe", { work_path+"/SourceLogo.bmp", work_path+"/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); proc.close(); //This should be removed, the file should be loaded directly without Dialog. logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin");
Danach wird per Save Button die Neue Datei gespeichert, und nachfolgend das ausgefuehrt:
QFile::remove(work_path+"/SourceLogo.bin"); QFile::remove(work_path+"/SourceLogo.bmp"); qDebug() << QFile::remove(work_path+"/Compiler.exe");
-
@JonB
so sieht es nun aus:Erster Schritt: beim/nach dem Laden des .bmp Pictures wird nachfolgendes ausgefuehrt:
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/Compiler.exe"); QProcess proc; proc.start(work_path+"/Compiler.exe", { work_path+"/SourceLogo.bmp", work_path+"/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); proc.close(); //This should be removed, the file should be loaded directly without Dialog. logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin");
Danach wird per Save Button die Neue Datei gespeichert, und nachfolgend das ausgefuehrt:
QFile::remove(work_path+"/SourceLogo.bin"); QFile::remove(work_path+"/SourceLogo.bmp"); qDebug() << QFile::remove(work_path+"/Compiler.exe");
@NeueKlasse
Das ist viel zu kompliziert und beantwortet meine Fragen nicht! Ich weiss nicht was funktioniert und was funkioniert nicht....QFile::remove(work_path+"/SourceLogo.bin"); // funktioniert ja oder nein? QFile::remove(work_path+"/SourceLogo.bmp"); // funktioniert ja oder nein? qDebug() << QFile::remove(work_path+"/Compiler.exe"); // muesst wissen was der `qDebug()` ausgibt?!
Danach:
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt");
QFile::remove(work_path+"/File.txt");
Nur das (kein
QProcess
) funktioniert nicht? Wie wissen Sie das? WeilFile.txt
existiert immernoch, auch nachdem Sie Ihr Programm beendet haben? -
@NeueKlasse
Das ist viel zu kompliziert und beantwortet meine Fragen nicht! Ich weiss nicht was funktioniert und was funkioniert nicht....QFile::remove(work_path+"/SourceLogo.bin"); // funktioniert ja oder nein? QFile::remove(work_path+"/SourceLogo.bmp"); // funktioniert ja oder nein? qDebug() << QFile::remove(work_path+"/Compiler.exe"); // muesst wissen was der `qDebug()` ausgibt?!
Danach:
QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt");
QFile::remove(work_path+"/File.txt");
Nur das (kein
QProcess
) funktioniert nicht? Wie wissen Sie das? WeilFile.txt
existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?QFile::remove(work_path+"/SourceLogo.bin"); // funktioniert!
QFile::remove(work_path+"/SourceLogo.bmp"); // funktioniert!
qDebug() << QFile::remove(work_path+"/Compiler.exe"); // qDebug gibt aus: falseQFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt"); Nur das (kein QProcess) funktioniert nicht? Wie wissen Sie das? Weil File.txt existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?
Ich sehe im Dateibrowser das die Dateien dementsprechend erzeugt und geloescht werden => QProcess arbeitet wie es soll, die hier stehende "File.txt" heisst bei mir: "Compiler.exe", und diese wird wiegesagt nicht gelöscht
-
QFile::remove(work_path+"/SourceLogo.bin"); // funktioniert!
QFile::remove(work_path+"/SourceLogo.bmp"); // funktioniert!
qDebug() << QFile::remove(work_path+"/Compiler.exe"); // qDebug gibt aus: falseQFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt"); Nur das (kein QProcess) funktioniert nicht? Wie wissen Sie das? Weil File.txt existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?
Ich sehe im Dateibrowser das die Dateien dementsprechend erzeugt und geloescht werden => QProcess arbeitet wie es soll, die hier stehende "File.txt" heisst bei mir: "Compiler.exe", und diese wird wiegesagt nicht gelöscht
@NeueKlasse
Denken Sie daran, dass mein Deutsch nicht so gut ist :)Ich weiss ihrer Datei ist
.exe
genannt. Aber das kann zu Problemen führen. Ich habe bewusst darum gebeten, das zu verwenden, genau was ich geschrieben habe:QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt");
.txt
nicht.exe
! (Und keinQProcess
während wir das testen.) Bitte. -
QFile::remove(work_path+"/SourceLogo.bin"); // funktioniert!
QFile::remove(work_path+"/SourceLogo.bmp"); // funktioniert!
qDebug() << QFile::remove(work_path+"/Compiler.exe"); // qDebug gibt aus: falseQFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::remove(work_path+"/File.txt"); Nur das (kein QProcess) funktioniert nicht? Wie wissen Sie das? Weil File.txt existiert immernoch, auch nachdem Sie Ihr Programm beendet haben?
Ich sehe im Dateibrowser das die Dateien dementsprechend erzeugt und geloescht werden => QProcess arbeitet wie es soll, die hier stehende "File.txt" heisst bei mir: "Compiler.exe", und diese wird wiegesagt nicht gelöscht
@NeueKlasse
Mir ist noch ein anderer Gedanke gekommen, ich kann vielleicht erraten, wo das Problem liegt... :)Qt "Resource" Datei (
:/rec/...
) ist "read-only". MitQFile::copy()
möglicherweise bleibt die kopierte Datei schreibgeschützt. Ich selbst verwende Linux, nicht Windows. Aber ich glaube, das mit WindowsQFile::remove()
kann ein "readonly" Datei nicht löschen.QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::setPermissions(work_path+"/File.txt", QFile::ReadOther | QFile::WriteOther); // Dieses! QFile::remove(work_path+"/File.txt");
?
-
@NeueKlasse
Mir ist noch ein anderer Gedanke gekommen, ich kann vielleicht erraten, wo das Problem liegt... :)Qt "Resource" Datei (
:/rec/...
) ist "read-only". MitQFile::copy()
möglicherweise bleibt die kopierte Datei schreibgeschützt. Ich selbst verwende Linux, nicht Windows. Aber ich glaube, das mit WindowsQFile::remove()
kann ein "readonly" Datei nicht löschen.QFile::copy(":/rec/Software/bmp2c-escher3d.exe", work_path+"/File.txt"); QFile::setPermissions(work_path+"/File.txt", QFile::ReadOther | QFile::WriteOther); // Dieses! QFile::remove(work_path+"/File.txt");
?
Das war die Loesung!, setPermissions.... (.txt file konnte zuvor ebenfalls nicht geloescht werden...)
Danke!gibt es hier noch eine andere Moeglichkeit ein File zu laden?
ich moechte keinen Dialog mehr, aber dennoch das Datei format beibehalten (String)//logo_binary (String) gets filled with the File/Name logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin"); //this example creates a new QFile named logo_binary => not ok QFile logo_binary(work_path+"/SourceLogo.bin");
-
Das war die Loesung!, setPermissions.... (.txt file konnte zuvor ebenfalls nicht geloescht werden...)
Danke!gibt es hier noch eine andere Moeglichkeit ein File zu laden?
ich moechte keinen Dialog mehr, aber dennoch das Datei format beibehalten (String)//logo_binary (String) gets filled with the File/Name logo_binary = QFileDialog::getOpenFileName(this, work_path+"/SourceLogo.bin"); //this example creates a new QFile named logo_binary => not ok QFile logo_binary(work_path+"/SourceLogo.bin");
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
setPermissions....
Ja, nur under Windows, unter Linux nicht notwendig.
ich moechte keinen Dialog mehr, aber dennoch das Datei format beibehalten (String)
QFileDialog::getOpenFileName()
ist nur dann der Fall, wenn Sie den Benutzer nach einem Dateinamen fragen möchten.
Wenn Sie bereits wissen, welches Pathanem Sie verwenden möchten, verwenden Sie es einfach. Bereits haben Sie:QFile logo_binary(work_path+"/SourceLogo.bin");
Das stimmt. Also verstehe ich nicht warum "not ok"? Wenn
QFileDialog::getOpenFileName()
gibtwork_path+"/SourceLogo.bin"
zurück dann ist das das selbe wieQFile logo_binary(work_path+"/SourceLogo.bin");
ohnegetOpenFilename()
. "das Datei format beibehalten" ist nicht relevant. -
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
setPermissions....
Ja, nur under Windows, unter Linux nicht notwendig.
ich moechte keinen Dialog mehr, aber dennoch das Datei format beibehalten (String)
QFileDialog::getOpenFileName()
ist nur dann der Fall, wenn Sie den Benutzer nach einem Dateinamen fragen möchten.
Wenn Sie bereits wissen, welches Pathanem Sie verwenden möchten, verwenden Sie es einfach. Bereits haben Sie:QFile logo_binary(work_path+"/SourceLogo.bin");
Das stimmt. Also verstehe ich nicht warum "not ok"? Wenn
QFileDialog::getOpenFileName()
gibtwork_path+"/SourceLogo.bin"
zurück dann ist das das selbe wieQFile logo_binary(work_path+"/SourceLogo.bin");
ohnegetOpenFilename()
. "das Datei format beibehalten" ist nicht relevant.@JonB
ich muss hier leider einen Screenshot einfuegen damit man sieht was ich meine:logo_binary ist in der ersten Zeile ein QString => Orange Farbe
und in der zweiten Zeile ein QFile => Dunkel Blaue Farbeim moment ist es so das es NUR ueber den QFileDialog funktioniert, ansonsten:
QFSFileEngine::open: No file name specifieddas File wird im QString Format hier weiterverwendet:
QFile *file = new QFile(logo_binary, NULL); file->open(QIODevice::ReadOnly);
-
@JonB
ich muss hier leider einen Screenshot einfuegen damit man sieht was ich meine:logo_binary ist in der ersten Zeile ein QString => Orange Farbe
und in der zweiten Zeile ein QFile => Dunkel Blaue Farbeim moment ist es so das es NUR ueber den QFileDialog funktioniert, ansonsten:
QFSFileEngine::open: No file name specifieddas File wird im QString Format hier weiterverwendet:
QFile *file = new QFile(logo_binary, NULL); file->open(QIODevice::ReadOnly);
Ich verstehe das Problem nicht. Übergib dem QFile Konstruktor einfach den zusammengesetzten string so wie du ihn auch an QProcess übergibst. Wo ist da das Problem? Und QFile muss nicht auf den heap angelegt werden. Einfach auf den Stack und gut ists.
-
Ich verstehe das Problem nicht. Übergib dem QFile Konstruktor einfach den zusammengesetzten string so wie du ihn auch an QProcess übergibst. Wo ist da das Problem? Und QFile muss nicht auf den heap angelegt werden. Einfach auf den Stack und gut ists.
ich verstehe nicht ganz auf was du hinaus moechtest, wie bereits oben beschrieben erzeugt
QFile logo_binary("mein Pfad");
eine QFile Variable.
ich brauche aber eine QString Variable, sieheQString logo_binary . . . . logo_binary = QFileDialog:getOpenFileName("mein Pfad");
-
ich verstehe nicht ganz auf was du hinaus moechtest, wie bereits oben beschrieben erzeugt
QFile logo_binary("mein Pfad");
eine QFile Variable.
ich brauche aber eine QString Variable, sieheQString logo_binary . . . . logo_binary = QFileDialog:getOpenFileName("mein Pfad");
QString logo_binary = "Mein Pfad" 🙄
-
QString logo_binary = "Mein Pfad" 🙄
This post is deleted! -
QString logo_binary = "Mein Pfad" 🙄
Habe es auch so versucht ohne Aenderung,
hat allerdings gerade geklickt..ich verarbeite das File (..den Pfad) danach folgendermassen weiter:
QFile *file = new QFile(logo_binary, NULL); file->open(QIODevice::ReadOnly);
Also mache ich doch gleich die Vereinfachung hier: (ohne zusaetzlichen Befehl)...
QFile *file = new QFile(work_path+"/SourceLogo.bin", NULL); file->open(QIODevice::ReadOnly);
und funktioniert. Aufjedenfall Danke!