2014-07-11 126 views
0

我正在C++中爲桌面目的創建qr代碼解碼器,並希望使用批處理文件在Windows上執行zbar以讀取圖像。zbar QR碼解碼問題

它將與Qt一起使用,我想知道如果我可以更改批處理文件的輸出以顯示在textEdit中,我已經將標準輸出std :: cout更改爲出現在textEdit中,我想這會做到這一點。

如果沒有辦法讓它直接出現,那麼我可以從批處理文件中獲取結果並將其返回到我的C++程序中?

這是我在網上找到考出改變的std ::法院代碼:

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

您可以在不使用批處理文件的情況下使用QProcess運行'zbarimg「test.bmp」',並使用QProcess API讀取輸出。 – vahancho

+0

我正在關注這個http://qt-project.org/doc/qt-5/QProcess.html,我無法弄清楚需要進入程序QString atm以運行此命令,atm我是什麼只是使用批處理文件,但你說它可以直接完成?感謝之前的快速回復 – bd99

回答

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; 
}