本文通过QProcess,实现了在Qt中调用外部程序(控制台程序),并将输出重定向到了一个QTextEdit里。效果如下图所示:
运行界面如下:
程序共包含以下三个文件:
- //: main.cpp
- #include "process.h"
- #include <QApplication>
- #include <QTextCodec>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
- QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
- Process w;
- w.show();
- return a.exec();
- }
- //: process.h
- #ifndef PROCESS_H
- #define PROCESS_H
- #include <QWidget>
- class QLabel;
- class QLineEdit;
- class QProcess;
- class QPushButton;
- class QTextEdit;
- class Process : public QWidget
- {
- Q_OBJECT
- public:
- Process(QWidget *parent = 0, Qt::WFlags flags = 0);
- ~Process();
- private slots:
- void runClicked();
- void readOutput();
- private:
- QProcess* cmd;
- QString output;
- QLabel* inputLabel;
- QLineEdit* inputEdit;
- QPushButton* runButton;
- QLabel* outputLabel;
- QTextEdit* outputEdit;
- };
- #endif // PROCESS_H
- //: process.cpp
- #include <QtGui>
- #include "process.h"
- Process::Process(QWidget *parent, Qt::WFlags flags)
- : QWidget(parent, flags)
- {
- inputLabel = new QLabel(tr("请输入命令:"));
- inputEdit = new QLineEdit;
- runButton = new QPushButton(tr("运行"));
- outputLabel = new QLabel(tr("运行结果如下:"));
- outputEdit = new QTextEdit;
- outputEdit->setReadOnly(true);
- QHBoxLayout* hlayout = new QHBoxLayout;
- hlayout->addWidget(inputEdit);
- hlayout->addWidget(runButton);
- QVBoxLayout* layout = new QVBoxLayout;
- layout->addWidget(inputLabel);
- layout->addLayout(hlayout);
- layout->addWidget(outputLabel);
- layout->addWidget(outputEdit);
- setLayout(layout);
- cmd = new QProcess;
- connect(inputEdit, SIGNAL(returnPressed()), this, SLOT(runClicked()));
- connect(runButton, SIGNAL(clicked(bool)), this, SLOT(runClicked()));
- connect(cmd, SIGNAL(readyRead()), this, SLOT(readOutput()));
- resize(500, 300);
- }
- Process::~Process()
- {
- }
- void Process::runClicked()
- {
- QString input = inputEdit->text();
- cmd->start(input);
- output = tr("");
- outputEdit->setText(output);
- }
- void Process::readOutput()
- {
- output += cmd->readAll();
- outputEdit->setText(output);
- }