This question already has answers here:
How to deal with "%1" in the argument of QString::arg()?
(3 answers)
Closed 9 years ago.
I have tried to use the example given in the Qt4.8 documentation:
#include <QCoreApplication>
#include <QString>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str;
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"
std::cout << str.toStdString().c_str() << std::endl;
str.arg("%1f").arg("Hello"); // returns "Hellof %2"
std::cout << str.toStdString().c_str() << std::endl;
return a.exec();
}
However this outputs :
%1 %2
%1 %2
both times. I have tried this on Windows 7 and Ubuntu, using QtCreator and from the command line. I have checked I have
QMake version 2.01a
Using Qt version 4.8.1 in /usr/lib/x86_64-linux-gnu
and in Windows:
QMake version 2.01a
Using Qt version 4.7.0 in C:\qt\4.7.0\lib
I have even checked my source files for non-ascii characters, e.g. the "%" sign is correct. Please tell me why this doesn't work!
Here is the PRO file I am using:
QT += core
QT -= gui
TARGET = testarg
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
The arg() functions do not modify the QString (if you look at the docs, these functions are const.) They return a new QString instead, which you aren't saving anywhere. If you want to modify the original string, you can do so with:
str = str.arg("%1f", "Hello");
If you want to preserve the original, just use a new QString instead:
QString tmp = str.arg("%1f", "Hello");
#include <QCoreApplication>
#include <QString>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str;
str = "%1 %2";
QString a = str.arg("%1f", "Hello"); // returns "%1f Hello"
std::cout << a.toStdString().c_str() << std::endl;
QString b = str.arg("%1f").arg("Hello"); // returns "Hellof %2"
std::cout << b.toStdString().c_str() << std::endl;
return a.exec();
}
note all arg overloads are const and return QString :).
Related
Windows 10 64bit, mingw32, qmake, qt quick project, when I use std::ostringstream to convert something like from int to string, the project cannot be started, when I change them to std::stoi, etc, the project works.
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <sstream>
#include <iostream>
using namespace std;
#include "drawarea.h"
int main(int argc, char *argv[])
{
std::ostringstream ss;
ss << "12";
std::cout << ss.str();
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<DrawArea>("ea.drawarea", 1, 0, "DrawArea");
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
error is as below:
01:37:09: Starting D:\qt\build-QtquickSample-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\QtquickSample.exe ...
01:37:10: D:\qt\build-QtquickSample-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\QtquickSample.exe exited with code -1073741511
If comment out below code, it will work.
std::ostringstream ss;
ss << "12";
std::cout << ss.str();
Why is this?
Just find that when I use filesystem::path (mingw things) in the code, also exit with that error code.
Note: I use c++17, with quick and quickocntrols2.
============================================================
update 2022.8.18
When I create a console project using cmake, the project works
# Set the minimum version of CMake that can be used
# To find the cmake version run
# $ cmake --version
cmake_minimum_required(VERSION 3.16)
# Set the project name
project (hello_cmake)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Add an executable
add_executable(hello_cmake main.cpp)
the c++ code is as below:
#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
std::ostringstream ss;
ss << "12";
std::cout << ss.str();
std::cout << "Hello CMake!" << std::endl;
return 0;
}
In Qt Creator I have a main.cpp file that of course contains the int main(int argc, char **argv) and in my MainWindow.h file it has code to set up a window, which is functional ( I did not post the code as it is not relevant ). The problem arises when since I am trying to use the msvc compiler (which I have successfully set up), Because when I use the MinGW compiler it runs correctly and sets up the window. However in my main.cpp file ->
#include <QCoreApplication>
#include <iostream>
#include "Engine/Window/MainWindow.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argc);
std::cout << "Starting application" << std::endl;
MainWindow w;
w.execute();
return a.exec();
}
When I run the application I don't see "Starting Application" I just see "Press <return> to close the window" Any help or tips would be greatly appreciated.
Edit: I would also like to note that I just used Qt's "auto detect" functionality to find these compilers.
Also my .pro file
QT += core
QT -= gui widgets
CONFIG += c++14
CONFIG += windeployqt
TARGET = BaneEngine_
CONFIG += console
CONFIG += app_bundle
INCLUDEPATH += $$PWD/ExtLibs/include
DEPENDPATH += $$PWD/ExtLibs/include
LIBS += -L$$PWD/ExtLibs/libs
LIBS += -lSDL2main -lSDL2test -lSDL2 -lglew32 -lOpenGL32
TEMPLATE = app
SOURCES += main.cpp \
Engine/Window/MainWindow.cpp
HEADERS += \
Engine/Window/MainWindow.h
#include <QApplication>
#include <iostream>
#include "Engine/Window/MainWindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argc);
std::cout << "Starting application" << std::endl;
MainWindow w;
w.show();
return a.exec();
}
I try to use Qt with CLion. My problem is that qDebug() doesn't print anything, but qInfo(), qWarning(), qCritical() and qFatal() works well. Here is my example code :
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
qDebug() << "This will not appear";
qInfo() << "This will appear";
qWarning() << "This will appear too";
qCritical() << "This will appear too";
return a.exec();
}
Specs :
Qt : 5.5.1
GCC : 5.3.1 (64bits)
CMake : 3.3.2
CLion : 1.2.2
Fixed by editing the ~/.config/QtProject/qtlogging.ini file as follows :
[Rules]
*.debug=true
Related Bugzilla entry
Try to enter ctrl+shift+alt+/ ->Registry and tick therun.processes.with.pty.
I am using Qt (5.5) and I want to exchange data in JSON format in a client-server application.
So the format is constant:
{
"ball":
{
"posx": 12,
"posy": 35
}
}
I would like to be able to define a ByteArray or string like so:
QByteArray data = "{\"ball\":{\"posx\":%s,\"posy\":%s}}"
and then just write whatever the values for that into the string.
How do I do that?
QtJson is baked into Qt 5. It is easy to use, and gets it all ready for you pretty easily.
#include <QCoreApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonDocument>
void saveToJson(QJsonObject & json);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJsonObject jsonObject;
saveToJson(jsonObject);
QJsonDocument jsonDoc(jsonObject);
qDebug() << "Example of QJsonDocument::toJson() >>>";
qDebug() << jsonDoc.toJson();
qDebug() << "<<<";
return a.exec();
}
void saveToJson(QJsonObject & json)
{
QJsonObject ball;
ball["posx"] = 12;
ball["posy"] = 35;
json["ball"] = ball;
}
output
Example of QJsonDocument::toJson() >>>
"{
"ball": {
"posx": 12,
"posy": 35
}
}
"
<<<
Note: qDebug() wraps QString objects in quotes when printing. To get rid of that, pass your QString into qPrintable(). And it puts endl in for you at the end of each line.
For a more complex example see the official:
JSON Save Game Example
http://doc.qt.io/qt-5/qtcore-json-savegame-example.html
Hope that helps.
And here are more examples of string manipulations, but for readability and maintainability, please use the QJson classes.
QString str;
str = QString("{\"ball\":{\"posx\":%1,\"posy\":%2}}").arg(12).arg(35);
qDebug() << qPrintable(str);
QByteArray ba = str.toLocal8Bit();
qDebug() << ba;
QString str2;
str2 = "{\"ball\":{\"posx\":"
+ QString::number(12)
+ ",\"posy\":"
+ QString::number(35)
+ "}}";
qDebug() << qPrintable(str2);
output
{"ball":{"posx":12,"posy":35}}
"{"ball":{"posx":12,"posy":35}}"
{"ball":{"posx":12,"posy":35}}
Note again that the quotes are added by qDebug() when printing a QByteArray object.
Hope that helps.
I have an application that when run through terminal, the user has the option between command-line mode or GUI mode.
There doesn't seem to be any output to the console at all when using std::cout. std::cout statements don't work in the main event loop.
I have added CONFIG += console to my .pro file.
For now, I have been using QTextStream() which works fine:
QTextStream(cout) << "Hello World" << std::endl;
My question is:
Why can I not use std::cout? Does this have something to do with Qt affecting input and output streams? I couldn't find any documentation in Qt's docs on this.
int main(int argc, char *argv[])
{
std::cout << argv[1] << std::endl; //This is being outputted.
//if(argc == 2 && !strcmp(argv[1],"-win")){
if(true){ //Just for this example's sake
QApplication a(argc, argv);
std::cout << "Hello" << std::endl; //This is not being ouputted.
MainWindow w;
w.show();
return a.exec();
}
else
{
qDebug() << "Console Mode.\n";
std::cout << "Console Mode.\n";
//Do stuff
}
}
This is not a Qt issue, but how std::cout works. You seem to blow up your std::cout in here:
std::cout << argv[1] << std::endl;
Your issue can be reproduced even with a simple program like this:
main.pro
TEMPLATE = app
TARGET = main
CONFIG -= qt
SOURCES += main.cpp
main.cpp
#include <iostream>
int main(int /*argc*/, char **argv)
{
std::cout << argv[1] << std::endl;
std::cout << "Hello stdout!" << std::endl;
if (std::cout.bad())
std::cerr << "I/O error while reading\n";
return 0;
}
Build and Run
Success: qmake && make && ./main foo
Failure: qmake && make && ./main
In your case argv[1] is nil and so this makes std::cout not to print anything more. I would suggest to either pass an argument all the time and/or check against argc with some help usage print. The best would be to use the builtin command line parser in QtCore these days.
You could ask why? Because it is undefined behavior. You can read the details from the documentation:
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);
After constructing and checking the sentry object, checks if sb is a null pointer. If it is, executes setstate(badbit) and exits.
If you happen to have an issue with the IDE itself, for instance QtCreator, then follow these steps in case of QtCreator:
Projects -> Select a kit -> Run tab -> Run section -> Arguments
Works OK for me:
QT += core
QT -= gui
TARGET = untitled
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
main.cpp:
#include <QCoreApplication>
#include <QTextStream>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
std::cout << "Hello World" << std::endl;
return a.exec();
}
EDIT:
#include <QCoreApplication>
#include <QTextStream>
#include <QtWidgets/QWidget>
#include <QDebug>
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "test" << std::endl; // <--- THE PROBLEM IS HERE...IF YOU TRY A SIMPLE STRING IT WORKS FINE SO THE PROBLEM IS argv[1] IS AN EMPTY STRING
//if(argc == 2 && !strcmp(argv[1],"-win")){
if(true){
//Just for this example's sake
QCoreApplication a(argc, argv);
std::cout << "Hello" << std::endl; //This is not being ouputted.
return a.exec();
}
else
{
qDebug() << "Console Mode.\n";
std::cout << "Console Mode.\n";
//Do stuff
} }