how to open a file in my qt app via double clicking on it
-
@eyllanesc
when i use args likeqDebug() << args.at(0);
i got thisThe program has unexpectedly finished.
@_-mohamed-_ what is
args
?, please provide a minimal and verifiable example. -
@_-mohamed-_ what is
args
?, please provide a minimal and verifiable example.@eyllanesc it is from the official example
const QStringList args = parser.positionalArguments(); // source is args.at(0), destination is args.at(1)
you can find it here:
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("my-copy-program"); QCoreApplication::setApplicationVersion("1.0"); QCommandLineParser parser; parser.setApplicationDescription("Test helper"); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("source", QCoreApplication::translate("main", "Source file to copy.")); parser.addPositionalArgument("destination", QCoreApplication::translate("main", "Destination directory.")); // A boolean option with a single name (-p) QCommandLineOption showProgressOption("p", QCoreApplication::translate("main", "Show progress during copy")); parser.addOption(showProgressOption); // A boolean option with multiple names (-f, --force) QCommandLineOption forceOption(QStringList() << "f" << "force", QCoreApplication::translate("main", "Overwrite existing files.")); parser.addOption(forceOption); // An option with a value QCommandLineOption targetDirectoryOption(QStringList() << "t" << "target-directory", QCoreApplication::translate("main", "Copy all source files into <directory>."), QCoreApplication::translate("main", "directory")); parser.addOption(targetDirectoryOption); // Process the actual command line arguments given by the user parser.process(app); const QStringList args = parser.positionalArguments(); // source is args.at(0), destination is args.at(1) bool showProgress = parser.isSet(showProgressOption); bool force = parser.isSet(forceOption); QString targetDir = parser.value(targetDirectoryOption); // ... }
-
@eyllanesc it is from the official example
const QStringList args = parser.positionalArguments(); // source is args.at(0), destination is args.at(1)
you can find it here:
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("my-copy-program"); QCoreApplication::setApplicationVersion("1.0"); QCommandLineParser parser; parser.setApplicationDescription("Test helper"); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("source", QCoreApplication::translate("main", "Source file to copy.")); parser.addPositionalArgument("destination", QCoreApplication::translate("main", "Destination directory.")); // A boolean option with a single name (-p) QCommandLineOption showProgressOption("p", QCoreApplication::translate("main", "Show progress during copy")); parser.addOption(showProgressOption); // A boolean option with multiple names (-f, --force) QCommandLineOption forceOption(QStringList() << "f" << "force", QCoreApplication::translate("main", "Overwrite existing files.")); parser.addOption(forceOption); // An option with a value QCommandLineOption targetDirectoryOption(QStringList() << "t" << "target-directory", QCoreApplication::translate("main", "Copy all source files into <directory>."), QCoreApplication::translate("main", "directory")); parser.addOption(targetDirectoryOption); // Process the actual command line arguments given by the user parser.process(app); const QStringList args = parser.positionalArguments(); // source is args.at(0), destination is args.at(1) bool showProgress = parser.isSet(showProgressOption); bool force = parser.isSet(forceOption); QString targetDir = parser.value(targetDirectoryOption); // ... }
@_-mohamed-_ How have you run your executable? You must run:
your_executable input_filename output_filename
. -
@_-mohamed-_ How have you run your executable? You must run:
your_executable input_filename output_filename
.@eyllanesc
I run the app from qt creatorbut the first argument should be the exe file path and it does not need second argument.
It should work when i call the first argument -
@eyllanesc
I run the app from qt creatorbut the first argument should be the exe file path and it does not need second argument.
It should work when i call the first argument@_-mohamed-_ No, precisely QCommandLineParser considers that it is not necessary and only obtains the arguments, not the name of the program. If you want to know the name of the executable then use
QFileInfo(QCoreApplication::applicationFilePath()).fileName()
.The format is:
executable arg1 arg2 ... argN
The executable name is not a program argument for
QCommandLineParser
. -
@_-mohamed-_ No, precisely QCommandLineParser considers that it is not necessary and only obtains the arguments, not the name of the program. If you want to know the name of the executable then use
QFileInfo(QCoreApplication::applicationFilePath()).fileName()
.The format is:
executable arg1 arg2 ... argN
The executable name is not a program argument for
QCommandLineParser
.@eyllanesc oh,
I thought it was likeQCoreApplication::arguments()
I need the second argument which is the path of the file I want to open
-
@eyllanesc oh,
I thought it was likeQCoreApplication::arguments()
I need the second argument which is the path of the file I want to open
@_-mohamed-_ If you want to pass arguments using Qt Creator then click on the "Projects" on the left side and press the "Run" button, then put the arguments in "Command Line Arguments"
-
@_-mohamed-_ If you want to pass arguments using Qt Creator then click on the "Projects" on the left side and press the "Run" button, then put the arguments in "Command Line Arguments"
@eyllanesc oh thanks this information will help me and save my time.
I tried to get the argument using QCommandLineParser, I got the same result
(C:\Users\moham\OneDrive\Desktop\????.txt
)note: when I open the same file using windows notepad it workes fine.
this is main.cpp:
#include "mainwindow.h" #include <QApplication> #include <QDebug> using namespace std; int main(int argc, char *argv[]) { QApplication a(argc, argv); QCommandLineParser parser; parser.process(a); QStringList args = parser.positionalArguments(); MainWindow w; w.settext(args.at(0)); w.show(); return a.exec(); }
and this is settext() function from mainwindow.cpp:
void MainWindow::settext(QString URL) { QStringList arguments = QCoreApplication::arguments(); if(arguments.count() > 1) { QFile file(URL); if(!file.open(QFile::ReadOnly | QFile::Text)) QMessageBox::information(this, "can't open file", "can't open the specified file"); else { QTextStream text(&file); text.setCodec("UTF-8"); QString fileContents = text.readAll(); ui->TextEdit->setPlainText(fileContents); file.close(); edited = false; url = URL; changeTitle(); } } }
when i double click the text file i got error(
QMessageBox::information(this, "can't open file", "can't open the specified file");
) -
@eyllanesc oh thanks this information will help me and save my time.
I tried to get the argument using QCommandLineParser, I got the same result
(C:\Users\moham\OneDrive\Desktop\????.txt
)note: when I open the same file using windows notepad it workes fine.
this is main.cpp:
#include "mainwindow.h" #include <QApplication> #include <QDebug> using namespace std; int main(int argc, char *argv[]) { QApplication a(argc, argv); QCommandLineParser parser; parser.process(a); QStringList args = parser.positionalArguments(); MainWindow w; w.settext(args.at(0)); w.show(); return a.exec(); }
and this is settext() function from mainwindow.cpp:
void MainWindow::settext(QString URL) { QStringList arguments = QCoreApplication::arguments(); if(arguments.count() > 1) { QFile file(URL); if(!file.open(QFile::ReadOnly | QFile::Text)) QMessageBox::information(this, "can't open file", "can't open the specified file"); else { QTextStream text(&file); text.setCodec("UTF-8"); QString fileContents = text.readAll(); ui->TextEdit->setPlainText(fileContents); file.close(); edited = false; url = URL; changeTitle(); } } }
when i double click the text file i got error(
QMessageBox::information(this, "can't open file", "can't open the specified file");
)@_-mohamed-_
So why not debug outURL
and the file path fromQFile file
for yourself? Do you mean that filename really has????
in it?? -
@_-mohamed-_
So why not debug outURL
and the file path fromQFile file
for yourself? Do you mean that filename really has????
in it??@JonB no the real file name is "عربي.txt" but i can't get the real name from app's argument
-
@JonB no the real file name is "عربي.txt" but i can't get the real name from app's argument
@_-mohamed-_
Look atfile.errorString()
when thefile.open()
fails. And print outURL
andfile.fileName()
. -
@_-mohamed-_
Look atfile.errorString()
when thefile.open()
fails. And print outURL
andfile.fileName()
.@JonB i printed the URL and i got (C:\Users\moham\OneDrive\Desktop????.txt) as i said in the previous post
Sofile.open ()
can't open a strange text (????.txt) -
@JonB i printed the URL and i got (C:\Users\moham\OneDrive\Desktop????.txt) as i said in the previous post
Sofile.open ()
can't open a strange text (????.txt)@_-mohamed-_ said in how to open a file in my qt app via double clicking on it:
i printed the URL and i got (C:\Users\moham\OneDrive\Desktop????.txt) as i said in the previous post
You must not print non-ascii characters on a windows console - windows is too stupid for this. You QMessageBox or similar.
-
@_-mohamed-_ said in how to open a file in my qt app via double clicking on it:
i printed the URL and i got (C:\Users\moham\OneDrive\Desktop????.txt) as i said in the previous post
You must not print non-ascii characters on a windows console - windows is too stupid for this. You QMessageBox or similar.
@Christian-Ehrlicher I have set the text in QTextEdit using
ui->TextEdit->setPlainText (URL)
-
@Christian-Ehrlicher I have set the text in QTextEdit using
ui->TextEdit->setPlainText (URL)
@_-mohamed-_
I said:Look at
file.errorString()
when thefile.open()
fails. -
@_-mohamed-_
I said:Look at
file.errorString()
when thefile.open()
fails.@JonB why? I said that
file.open()
fail because the path is incorrectok now I tried
file.errorString()
and it returnsThe filename, directory name, or volume label syntax is incorrect.
-
I tried to open the same file with all text editors on my computer like (notepad++, VScode, Pycharm, Qt creator...) And they all opened the file successfully, is the problem in Qt?
-
I got a new problem when i override dropEvent function in QTextEdit
I usedevent->mimedata()->urls->at (0)
to get the url of the droped fileBut i got the same problem which is in arabic letters files name i got questions marks instade of the real file name(?????)
-
I got a new problem when i override dropEvent function in QTextEdit
I usedevent->mimedata()->urls->at (0)
to get the url of the droped fileBut i got the same problem which is in arabic letters files name i got questions marks instade of the real file name(?????)
@_-mohamed-_
How do you know that? @Christian-Ehrlicher wrote earlierYou must not print non-ascii characters on a windows console - windows is too stupid for this. You QMessageBox or similar.
Did you act on that? It is not clear to me how you are outputting this string, have you looked at it on a
QMessageBox
or aQLabel
, or have you used the debugger to check what the actual bytes are in the string? -
@_-mohamed-_
How do you know that? @Christian-Ehrlicher wrote earlierYou must not print non-ascii characters on a windows console - windows is too stupid for this. You QMessageBox or similar.
Did you act on that? It is not clear to me how you are outputting this string, have you looked at it on a
QMessageBox
or aQLabel
, or have you used the debugger to check what the actual bytes are in the string?@JonB
Oh it's my fault this time, I usedqDebug()
to see the output, Sorry
now I usedQMessageBox
and it works(i meandropEvent()
function)Thanks for your alert!