Innerhalb QT .exe mit Argumenten Ausfuehren
-
@Christian-Ehrlicher
sorry, hier der Codevoid 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::startDetached("PATH/LogoCompiler.exe" "Logo" "logo_binary" "-b" "-c"); //QProcess::waitForFinished(2000); QFile Logo_Bin(logo_binary); //QFile::remove("PATH/LogoCompiler.exe"); }
-
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
if (!Logo.open(QFile::ReadOnly | QFile::Text))
Ein bitmap/
.bmp
Datei ist keinText
Datei! Aber macht nichts, da Sie es (Logo
) nie benutzen :)QProcess::startDetached("PATH/LogoCompiler.exe" "Logo" "logo_binary" "-b" "-c");
Argumenten ->
{ "Logo", "logo_binary", "-b", "-c" }
Wenn Sie
startDetached()
benutzen, dann werde Sie nie wissen, wann es fertig ist. Ist das für Sie ok? -
Sind die Argumente in meinem Fall richtig gewaehlt? es scheint zumindestens so nicht zu funktionieren...
es muss nicht unbedingt ueber startDetached() laufen, das war lediglich das erste mit was ich in berührung gekommen bin.
-
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
Sind die Argumente in meinem Fall richtig gewaehlt?
Ich weiss nicht! Versuchen Sie es in einem Terminal.
QProcess proc; proc.start("PATH/LogoCompiler.exe", { "Logo", "logo_binary", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError();
-
Falls die Datei wirklich "Logo" heißt würde ich dennoch bezweifeln dass sie im aktuellen Verzeichnis liegt sondern irgendwo anders z. B. im source-Verzeichnis.
-
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");
-
habs nun soweit geschafft... wenn ich die Directories alle manuell angebe,
gibt es hier keine Moeglichkeit die benotigten und konvertierten Dateien innerhalb der Application abzulegen? um nicht an irgendwelche Pfade gebunden zu sein..ganz unten musste ich nocheinmal die logo_binary via QFileDialog oeffnen..
QFile logo_binary("PATH"); hat hier nicht geklappt da logo_binary als string und nicht als File vorhanden sein muss...QFile::copy(":/rec/Software/bmp2c-escher3d.exe", "PATH/LogoCompiler.exe"); QProcess proc; proc.start("PATH/LogoCompiler.exe", { "PATH/SourceLogo.bmp", "PATH/SourceLogo.bin", "-b", "-c" } ); qDebug() << proc.waitForFinished(); qDebug() << proc.readAllStandardOutput(); qDebug() << proc.readAllStandardError(); logo_binary = QFileDialog::getOpenFileName(this, "PATH/SourceLogo.bin"); }
-
@NeueKlasse said in Innerhalb QT .exe mit Argumenten Ausfuehren:
gibt es hier keine Moeglichkeit die benotigten und konvertierten Dateien innerhalb der Application abzulegen
nein, aber es gibt:
https://doc.qt.io/qt-6/qstandardpaths.htmlfür eine OS/PC und Platform unabhängige Pfad Erstellung
-
@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 :) -
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
? -
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");
-
@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
-
@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. -
@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");