我正在用C ++创建一个用于桌面目的的qr代码解码器,并希望使用批处理文件在Windows上执行zbar来读取图像。
它将与Qt一起使用,我想知道我是否可以将批处理文件的输出更改为出现在textEdit中,我已经将标准输出std :: cout更改为出现在textEdit中,我认为这样就可以了。
如果没有办法让它直接显示有没有办法可以从批处理文件中获取结果并将其带回我的c ++程序?
以下是我在网上找到的用于测试更改std :: cout:
的代码main.cpp中:
#include "qr.h"
#include <QtGui/QApplication>
#include <QtGui>
#include "qdebugstream.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.connect(&app,SIGNAL(lastWindowClosed()),&app,SLOT(quit()));
//QR w;
//w.show();
QMainWindow* mainWindow = new QMainWindow();
QTextEdit* myTextEdit = new QTextEdit(mainWindow);
myTextEdit->setReadOnly(true);
QDebugStream qout(std::cout, myTextEdit);
std::clog<<"hello";
mainWindow->show();
std::cout << "TEST" << std::endl;
//system("D:\\QRCode\\JQR_Gen\\Debug\\runZbar.bat");
return app.exec();
}
qdebugstream.h:
#ifndef QDEBUGSTREAM_H
#define QDEBUGSTREAM_H
#include <iostream>
#include <streambuf>
#include <string>
#include "qtextedit.h"
class QDebugStream : public std::basic_streambuf<char>
{
public:
QDebugStream(std::ostream &stream, QTextEdit* text_edit) : m_stream(stream)
{
log_window = text_edit;
m_old_buf = stream.rdbuf();
stream.rdbuf(this);
}
~QDebugStream()
{
// output anything that is left
if (!m_string.empty())
log_window->append(m_string.c_str());
m_stream.rdbuf(m_old_buf);
}
protected:
virtual int_type overflow(int_type v)
{
if (v == '\n')
{
log_window->append(m_string.c_str());
m_string.erase(m_string.begin(), m_string.end());
}
else
m_string += v;
return v;
}
virtual std::streamsize xsputn(const char *p, std::streamsize n)
{
m_string.append(p, p + n);
int pos = 0;
while (pos != std::string::npos)
{
pos = m_string.find('\n');
if (pos != std::string::npos)
{
std::string tmp(m_string.begin(), m_string.begin() + pos);
log_window->append(tmp.c_str());
m_string.erase(m_string.begin(), m_string.begin() + pos + 1);
}
}
return n;
}
private:
std::ostream &m_stream;
std::streambuf *m_old_buf;
std::string m_string;
QTextEdit* log_window;
};
#endif
这是批处理文件代码:
@set PATH=%PATH%;C:\Program Files (x86)\ZBar\bin
@cd D:\QRCode\JQR_Gen
@zbarimg "test.bmp"
任何帮助都会非常感激,希望这样做,因为它似乎比在c ++中正确使用zbar容易得多,因为我读到它在Windows上没有很好的功能。
提前致谢。
答案 0 :(得分:0)
这是一个使用QProcess的简单而非编译的例子。
#include <QProcess>
int main(int argc, char *argv[])
{
QProcess qCommandZbarimg;
qCommandZbarimg.start("C:\\Program Files (x86)\\ZBar\\bin\\zbarimg.exe",
QStringList() << "Path\\To\\Bitmap\\test.bmp");
// Wait only up to 2000 ms for successful termination of the command.
if(qCommandZbarimg.waitForFinished(2000))
{
// Okay, "zbarimg.exe test.tmp" was executed successfully.
// Read output of this command to stdout into an array of bytes.
QByteArray qCommandOuput = qCommandZbarimg.readAll();
qCommandZbarimg.close();
// Has the command written anything to stdout?
if(qCommandOuput.size() > 0)
{
// Do whatever you want to do with the output.
}
}
// Dummy code to have no warnings on build.
if(argv[0][1] == ' ') return argc;
return 0;
}