Innerhalb QT .exe mit Argumenten Ausfuehren
-
@NeueKlasse Ja, beides ist möglich. Siehe QProcess Dokumentation.
-
@Christian-Ehrlicher
Danke, die Dokumentation koennte meiner Meinung nach mehr examples beinhalten...Habe jetzt mal ein wenig herumprobiert,
das QFile Copy funktioniert nun einwandfrei,
was mir Probleme macht ist nach wie vor das QProcess....
und 2. das QFile nach dem Process zu loeschen.. ueber remove loescht er es mir nicht?Koenntest Du mir hier bitte weiterhelfen?
Wenn ich die Argumente weglasse dann bringt er folgende Zeile im Application Output:
das sieht soweit ganz gut aus und weisst auf fehlende Argumente hin, aber wie die zu schreiben sind?
-
Naja "load_path" sieht für mich nicht wie eine bmp-Datei aus...
-
This post is deleted!
-
Sorry, sollte so aussehen, die bitmap wird natuerlich vorher via QFileDialog eingelesen
und als logo_bitmap weiter verarbeitet. -
Christian Ehrlicher Lifetime Qt Championreplied to NeueKlasse on last edited by Christian Ehrlicher
@NeueKlasse bitte poste Code und keine Bilder.
Mein letzter Kommentar ist immer noch gültig... '"logo_bitmap"' und 'logo_bitmap' ist nicht das selbe.
-
@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");