Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1695779
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: 嵌入式

2011-04-08 11:18:11

因为目前的程序需要提供一个文件对比的功能,而目前已经有专门的文本对比软件,所以我打算直接调用外部的文本对比程序。
通过查阅QT的帮助文档,发现了QProcess这个类可以提供这种需求。
我找到的启动外部程序的方法有以下两种:
1、start()

void QProcess::start ( const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite )
Starts the program program in a new process, passing the command line arguments in arguments. The OpenMode is set to mode. QProcess will immediately enter the Starting state. If the process starts successfully,QProcess will emit started(); otherwise, error() will be emitted.

Note that arguments that contain spaces are not passed to the process as separate arguments.

Windows: Arguments that contain spaces are wrapped in quotes.

Note: Processes are started asynchronously, which means the started() and error() signals may be delayed. Call waitForStarted() to make sure the process has started (or has failed to start) and those signals have been emitted.

See also pid(), started(), and waitForStarted().


2、使用QProcess::execute(), 不过使用此方法时程序会最阻塞直到此方法执行的程序结束后返回,这时候可使用QProcess和QThread这两个类结合使用的方法来处理,以防止在主 线程中调用而导致阻塞的情况
先从QThread继承一个类,重新实现run()函数:

Quote:
class MyThread : public QThread
{
public:
void run();
};

void MyThread::run()
{
QProcess::execute("notepad.exe");
}

这样,在使用的时候则可定义一个MyThread类型的成员变量,使用时调用其start()方法:

Quote:
class ...............
{...........
MyThread thread;
............
};

.....................
thread.start();

两个的具体的区别我不是很清楚,但我在程序中分别试了下,发现第二个会阻塞主程序,但使用start()则不会。下面是我使用QProcess启动WinMerge的代码。
#include
QProcess *process = new QProcess;
QStringList str;
str << "";
process->start("./WinMerge/WinMergeU.exe",str);
如果程序里面不输入参数,就会直接到软件直接运行时的界面。
加参数后弹出的界面是工具栏第一列中的第一个需要输入的界面(这个是我猜测的,不确定,但确实能弹出)。
下面是截图:
GUI里的按钮:



点击交换机配置比较后:




嗯,这样就可以启动外部程序了。

补充:在主程序退出时,启动的外部程序是不会随着主程序的退出而退出的,我们当然不希望这种情况。
继续查阅QT帮助文档,发现close这个函数,看下它的说明:

void QProcess::close ()   [virtual]
Closes all communication with the process and kills it. After calling this function, QProcess will no longer emit readyRead(), and data can no longer be read or written.

Reimplemented from QIODevice.

可以看到,调用这个后会关闭所有的process启动的外部程序。因此,可以在主程序推出前,加一个判断

if(process)

process->close();

delete process;

process = 0;

阅读(2494) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~