我有以下代码:
void Processmethod()
{
QDialog *ProcessMessage = new QDialog;
Ui::DialogProcessMessage Dialog;
Dialog.setupUi(ProcessMessage);
ProcessMessage->setModal(true);
ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
ProcessMessage->show();
qApp->processEvents();
processmethodONE();
processmethodTWO();
processmethodTHREE();
}
void processmethodONE()
{
QString ProcessCommand = "w8 " + blablubli";
Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly defined
Prozess.setStandardOutputFile(Path); //in my class
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessCommand);
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
QProcess::ExitStatus Status = Prozess.exitStatus();
if (Status == 0)
{
std::cout << "File created!" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在此源代码中,我尝试在某些进程启动之前打开一个弹出对话框。问题是对话框不可点击,但在对话框上我想创建一个按钮来中止正在运行的方法。如您所见,我尝试使用 QThread 在另一个线程中运行进程,但仍然无法单击该对话框。此外,如果我使用“application/x-executable”文件打开我的应用程序(GUI),则在激活上述方法时会丢失对话框内容。我该如何解决这些问题?我哪里错了?你好
QProcess不会显示黑色控制台窗口.
这是我使用的代码:
QProcess*p=new QProcess(this);
p->start("cmd.exe");
Run Code Online (Sandbox Code Playgroud)
用calc.exe替换cmd.exe成功启动计算器.
我需要从QProcess运行以下语句:
programm < file1 > file2
Run Code Online (Sandbox Code Playgroud)
在QT:
QProcess *proc = new QProcess;
proc->setReadChannelMode(QProcess::SeparateChannels);
proc->start("program < \"file1\" > \"file2\"", QIODevice::ReadWrite);
Run Code Online (Sandbox Code Playgroud)
但不知怎的,它不起作用.我在taskmanager中看到,该命令看起来正确,但似乎程序在没有任何参数的情况下执行.我的错误在哪里?
我有这个简单的C++程序:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QProcess ps;
QByteArray ba;
ps.start("ls J:");
ba = ps.readAllStandardOutput();
char *someData = ba.data();
cout << "Testing QProcess ..." << endl;
cout << someData << endl;
cout << "done!" << endl;
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Testing QProcess ...
done!
Run Code Online (Sandbox Code Playgroud)
如果我从Windows cmd运行"ls J:"它可以工作.我错过了什么?
我正在尝试在Qt(在Linux中)执行一个执行python脚本的进程,但我无法使其工作.这是代码:
QProcess process;
QString scriptFile = "../../scriptPath/script.py";
QString pyCommand = "\"python " + scriptFile +
" -f " + parameter1 +
" -t parameter2" +
" -v parameter3" +
" -e " + parameter4 + "\"";
printf("PyCommand: %s\n", qStringToStdString(pyCommand).c_str());
process.start ("bash", QStringList () << "-c" << pyCommand);
Run Code Online (Sandbox Code Playgroud)
其中parameter1
和parameter3
是将QString,我从文件对话框得到(两条路径是正确的),并parameter2
和parameter4
有硬编码字符串(以防万一,这些字符串的字符" - "和他们"").函数qStringToStdString
是我创建的一个函数,用于将a转换QString
为a std::string
并且它工作正常(我已经使用过它).
PyCommand在控制台中打印,看起来很好.事实上,如果我打开一个终端并尝试执行bash -c
后面的printf指令,它的工作原理.但是当我执行Qt应用程序时它不起作用.
有人可以帮帮我吗?我错过了什么?
最简单的代码:
void test
{
QProcess p;
p.start("sleep 10");
p.waitForBytesWritten();
p.waitForFinished(1);
}
Run Code Online (Sandbox Code Playgroud)
当然,该过程无法在函数结束之前完成,因此它会显示一条警告消息:
QProcess: Destroyed while process ("sleep") is still running.
Run Code Online (Sandbox Code Playgroud)
我希望这条消息不被显示 - 我应该在结束函数之前自己销毁这个过程,但我找不到如何正确地做到这一点:p.~QProcess(),p.terminate(),p.kill( )无法帮助我.
注意:我不想等待进程执行,只是在运行时自己杀死它.
在下面的代码中,我想将lambda函数连接到QProcess :: error signal:
void Updater::start() {
QProcess process;
QObject::connect(&process, &QProcess::error, [=] (QProcess::ProcessError error) {
qWarning() << "error " << error;
});
process.start("MyProgram");
process.waitForFinished();
}
Run Code Online (Sandbox Code Playgroud)
但我得到奇怪的错误:
错误:没有匹配函数来调用'Updater :: connect(QProcess*[未解析的重载函数类型],Updater :: start()::)'});
我在这做错了什么?代码在从QObject派生的类的方法内执行.该项目配置为使用c ++ 11.
我在Linux x32上使用Qt 5.3.1和gcc 4.9.2
我在WindowsXP-Machine上使用简单的QProcess-Project:
QString program = "U:\\ffmpeg.exe";
QStringList arguments;
arguments << "-i" << "U:\\clock.avi" << "U:\\tmp_jpeg\\foo-%03d.jpeg";
process.setStandardOutputFile("U:\\log.txt", QIODevice::Append);
process.start(program, arguments);
Run Code Online (Sandbox Code Playgroud)
该过程工作得很好,ffmpeg创建我想要的所有文件.但是log-File保持完全为空.当我想在qDebug()处写标准输出时也会发生同样的情况...为什么会发生这种情况,我该如何解决?
我读了一些文档,但对我来说还不够清楚.我知道两个"结束"进程并且kill()意味着强制它结束,但是终止()应该做什么呢?
我想在 PyQt5 中排队 QProcess 或者只是阻塞,同时仍然使用 readAll() 读取标准输出。相当于 subprocess.call 而不是 subprocess.Pop。当使用 waitForFinished() 时,带有 readAll() 的 stdout 将在进程结束时立即出现,而不是在处理过程中流出。
示例脚本:
from PIL import Image
import numpy as np
import sys
from PyQt5 import QtGui,QtCore, QtWidgets
class gui(QtWidgets.QMainWindow):
def __init__(self):
super(gui, self).__init__()
self.initUI()
def dataReady(self):
cursor = self.output.textCursor()
cursor.movePosition(cursor.End)
cursor.insertText(str(self.process.readAll(), "utf-8"))
self.output.ensureCursorVisible()
def callProgram(self):
# run the process
# `start` takes the exec and a list of argument
filepath = 'path\image.tif'
self.process.start('some_command filepath'])
# This will output a file image.tif specified by filepath:
# …
Run Code Online (Sandbox Code Playgroud)