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;
}
Related
Сalling a dialog resets a message handler in debian like linux
And yes, no details are required here anymore, but I have to add this text to go through the smart bot
#include <QApplication>
#include <QFileDialog>
#include <QDebug>
QtMessageHandler defaultHandler;
void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
auto str = msg;
str.append(" handled");
defaultHandler(type, context, str);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "test0";
defaultHandler = qInstallMessageHandler(messageHandler);
qDebug() << "test1";
QFileDialog::getSaveFileName();
qDebug() << "test2";
}
output in windows
test0
test1 handled
test2 handled
output in debian like linux
test0
test1 handled
warning: QFSFileEngine::open: No file name specified
debug: test2
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 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
} }
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 :).