如何隐藏在 Qt 应用程序中打开的 windows 终端?
How to hide windows Terminal opened in Qt app?
首先,有类似的问题,但我认为这是一个不同的问题,因为 Windows 终端仅在我调用 system()
时出现,而不是在应用程序启动时出现。
我有一个带有 gui 的程序,它是用 C++ 和 Qt 编写的,并使用 MinGW 编译器在带有 .pro
文件的 qmake 中构建。 OS 是 Windows 10 在虚拟框中。
我在 Ubuntu 中编写代码,它按预期工作(根本看不到 OS 终端),但现在我正在 Windows 中测试它。我的问题是,每当我在我的代码中调用 system()
或类似代码来执行另一个程序(据说在后台)时,Windows 在我的 gui 前面打开一个 cmd 终端。我的程序中有很多这样的调用,因此在运行时有很多这样的 windows 弹出和消失。
我将 main() 设置为 WinMain() 并从 qmake 配置中删除了控制台,但这没有显示任何效果。
我的 .pro
文件(删除评论):
QT += core gui
CONFIG -= console
QMAKE_CXXFLAGS += -std=c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = regionfind-gui
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
regionfind.cpp \
sagacmd.cpp
HEADERS += \
regionfind.h \
sagacmd.h \
processingsteps.h
FORMS += \
regionfind.ui
RESOURCES += \
images.qrc
构建命令(从 QtCreator 生成):
C:\Qt\Qt5.12.3.12.3\mingw73_64\bin\qmake.exe C:\Users\dev\Documents\regionfind-gui\regionfind-gui.pro -spec win32-g++ && C:/Qt/Qt5.12.3/Tools/mingw730_64/bin/mingw32-make.exe qmake_all
如何摆脱这些终端windows?当命令没有任何输出时它们不会打开,但我无法抑制一般输出或类似输出,因为在某些情况下我正在存储输出并将其打印到我的 gui 中,使用以下代码:
array<char, 128> buffer;
string result = getDescription(getStep()) + command + "\n";
unique_ptr<FILE, decltype(&pclose) > pipe(popen(command.c_str(), "r"), pclose);
if(!pipe) throw std::runtime_error("popen() failed");
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += checkOutput(buffer.data());
getGui()->txtOutput->append(QString::fromStdString(removeNewlineAtEnd(buffer.data())));
getGui()->txtOutput->repaint();
cout << buffer.data() << flush;;
}
示例:system("mkdir C:\Users\dev\Documents\testfolder")
不会打开 window(无输出)但 system("driverquery")
会。
您可以使用 QProcess
class:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever
在使用命令应用程序的情况下,您可以执行以下操作:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
QString command = QString("cmd.exe %1 \"%2 \"").arg(" /C ").arg(program);
myProcess->start(command);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever
首先,有类似的问题,但我认为这是一个不同的问题,因为 Windows 终端仅在我调用 system()
时出现,而不是在应用程序启动时出现。
我有一个带有 gui 的程序,它是用 C++ 和 Qt 编写的,并使用 MinGW 编译器在带有 .pro
文件的 qmake 中构建。 OS 是 Windows 10 在虚拟框中。
我在 Ubuntu 中编写代码,它按预期工作(根本看不到 OS 终端),但现在我正在 Windows 中测试它。我的问题是,每当我在我的代码中调用 system()
或类似代码来执行另一个程序(据说在后台)时,Windows 在我的 gui 前面打开一个 cmd 终端。我的程序中有很多这样的调用,因此在运行时有很多这样的 windows 弹出和消失。
我将 main() 设置为 WinMain() 并从 qmake 配置中删除了控制台,但这没有显示任何效果。
我的 .pro
文件(删除评论):
QT += core gui
CONFIG -= console
QMAKE_CXXFLAGS += -std=c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = regionfind-gui
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
regionfind.cpp \
sagacmd.cpp
HEADERS += \
regionfind.h \
sagacmd.h \
processingsteps.h
FORMS += \
regionfind.ui
RESOURCES += \
images.qrc
构建命令(从 QtCreator 生成):
C:\Qt\Qt5.12.3.12.3\mingw73_64\bin\qmake.exe C:\Users\dev\Documents\regionfind-gui\regionfind-gui.pro -spec win32-g++ && C:/Qt/Qt5.12.3/Tools/mingw730_64/bin/mingw32-make.exe qmake_all
如何摆脱这些终端windows?当命令没有任何输出时它们不会打开,但我无法抑制一般输出或类似输出,因为在某些情况下我正在存储输出并将其打印到我的 gui 中,使用以下代码:
array<char, 128> buffer;
string result = getDescription(getStep()) + command + "\n";
unique_ptr<FILE, decltype(&pclose) > pipe(popen(command.c_str(), "r"), pclose);
if(!pipe) throw std::runtime_error("popen() failed");
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += checkOutput(buffer.data());
getGui()->txtOutput->append(QString::fromStdString(removeNewlineAtEnd(buffer.data())));
getGui()->txtOutput->repaint();
cout << buffer.data() << flush;;
}
示例:system("mkdir C:\Users\dev\Documents\testfolder")
不会打开 window(无输出)但 system("driverquery")
会。
您可以使用 QProcess
class:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
myProcess->start(program);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever
在使用命令应用程序的情况下,您可以执行以下操作:
QObject *parent;
...
QString program = "driverquery";
QProcess *myProcess = new QProcess(parent);
QString command = QString("cmd.exe %1 \"%2 \"").arg(" /C ").arg(program);
myProcess->start(command);
if (myProcess->waitForStarted(-1)) {
while(myProcess->waitForReadyRead(-1)) {
getGui()->txtOutput->append( myProcess->readAllStandardOutput() );
}
}
// else report error or whatever