• 11179阅读
  • 24回复

[提问]QProcess问题,求大神解决!!! [复制链接]

上一主题 下一主题
离线woqaocc
 
只看楼主 倒序阅读 楼主  发表于: 2012-06-02
我想点击一个按钮然后调用外部程序
QObject::connect(btn_helloui, SIGNAL(clicked()), helloui, SLOT(hello()));
void helloui::hello()
{
    QProcess *process = new QProcess;
    if (process)
        process->start("./hello/hello");
}
问题是在主程序退出时,启动的外部程序是不会随着主程序的退出而退出的。
我查了查资料,说是用close()这个函数,但是我还是用不来。。我是小白……
哪位大神可以帮我把hello()这个函数补充完整……
离线xie133
只看该作者 1楼 发表于: 2012-06-02
不是在槽函数中关闭,而应该在析构函数里面 调用 process->close();你的process应该写成类的全局变量。
离线jdwx

只看该作者 2楼 发表于: 2012-06-02
回 楼主(woqaocc) 的帖子
这个问题好解决,把这个QProcess变成类的成员变量就行了,不要用new。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线woqaocc
只看该作者 3楼 发表于: 2012-06-02
回 1楼(xie133) 的帖子
class helloui : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit helloui(QWidget *parent = 0);
    ~helloui();
    
private:
    Ui::helloui *ui;

private slots:
    void hello();
};
该怎么写成类的全局变量啊?不是很懂。。
在析构函数里调用close()
helloui::~helloui()
{
    if (!process)
    {
        process->close();
        delete process;
    }
    delete ui;
}
是这样吗?
离线woqaocc
只看该作者 4楼 发表于: 2012-06-02
回 2楼(jdwx) 的帖子
能否具体一点呢。。不是很理解……
离线roywillow

只看该作者 5楼 发表于: 2012-06-02
class helloui : public QMainWindow
{
    Q_OBJECT

public:
    explicit helloui(QWidget *parent = 0);
    ~helloui();

private:
    Ui::helloui *ui;
    QProcess *process;

private slots:
    void hello();
};

helloui::helloui(QWidget *parent) : QWidget
{
//blablablabla...
process = new QProcess(this); //don't foget  "this"
connect(blablabla...);
}

helloui::~helloui()
{
process->terminate(); // or process->close()?
}

随手直接在回复框中写的,没测试,大概就这意思
因为
你的要求大概是,需要在窗口析构的时候能够控制这个QProcess
所以
想想你究竟该怎么一直把握住它的控制权吧
比如
把它声明为成员变量神马的

专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 6楼 发表于: 2012-06-02
class helloui : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit helloui(QWidget *parent = 0);
    ~helloui();
    
private:
    Ui::helloui *ui;
   QProcess process;
private slots:
    void hello();
};
就是这样的。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线kimtaikee

只看该作者 7楼 发表于: 2012-06-02
LZ那样写代码会造成内存泄露,解决方案:
1.
  1. QProcess* pLauncher = new QProcess;
  2. /* do something about the pLauncher */
  3. pLauncher->doSth();
  4. delete pLauncher

2.
  1. QScopedPointer<QProcess> pLauncher(new QProcess);
  2. /* do sth about the pLauncher */
  3. pLauncher->doSth();

3.
  1. QProcess launcher;
  2. launcher.doSth();

离线woqaocc
只看该作者 8楼 发表于: 2012-06-03
回 6楼(jdwx) 的帖子
/home/benj/helloUI-build-desktop-Qt_4_8_1_in_PATH__System__Release/../helloUI/helloui.h:20: error: 'QProcess' does not name a type
这个是编译后的错误。。怎么解?
离线woqaocc
只看该作者 9楼 发表于: 2012-06-03
回 5楼(roywillow) 的帖子
申明变量出现上面的问题怎么办?。。
离线woqaocc
只看该作者 10楼 发表于: 2012-06-03
回 7楼(kimtaikee) 的帖子
我那样的写法与您的第一个方案似乎没有区别呀?。。
在线uidab

只看该作者 11楼 发表于: 2012-06-03
回 9楼(woqaocc) 的帖子
#include <QProcess>

这句加入到 .h文件啊!!!
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线woqaocc
只看该作者 12楼 发表于: 2012-06-03
回 11楼(uidab) 的帖子
对哦~可以了!这个给忘了……我之前放在cpp里了。。非常感谢!!
离线XChinux

只看该作者 13楼 发表于: 2012-06-03
void helloui::hello()
{
    QProcess *process = new QProcess;
    if (process)
    {
        connect(qApp, SIGNAL(aboutToClose()), process, SLOT(terminate());
        process->start("./hello/hello");
    }
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线kimtaikee

只看该作者 14楼 发表于: 2012-06-03
回 10楼(woqaocc) 的帖子
区别大了,你没有delete 掉 new 生成的对象就会造成内存泄露

离线benbenmajia

只看该作者 15楼 发表于: 2012-06-04
你这样在一个函数里面new一个对象是很不好的习惯,比较容易造成内存泄露,在多次点击该button的情况会出现相当多的问题。
安然.....
离线woqaocc
只看该作者 16楼 发表于: 2012-06-05
回 14楼(kimtaikee) 的帖子
好的~我记住了!谢谢!
离线woqaocc
只看该作者 17楼 发表于: 2012-06-05
回 15楼(benbenmajia) 的帖子
嗯嗯!楼上的也提到了!我会注意的!!是不是在析构里加上delete process把指针删除就可以吧
离线benbenmajia

只看该作者 18楼 发表于: 2012-06-05
回 17楼(woqaocc) 的帖子
如果就这么delete的话内存泄露肯定还是会大批存在
要注意new/delete必须成对出现
安然.....
离线kimtaikee

只看该作者 19楼 发表于: 2012-06-05
回 18楼(benbenmajia) 的帖子
你别忘了如果new 之后出现异常的话就不会执行到delete那部分,所以最好还是用智能指针。

离线benbenmajia

只看该作者 20楼 发表于: 2012-06-05
回 19楼(kimtaikee) 的帖子
要我说的很清楚么,如果这个信号多次被调用,会出现什么情况?
安然.....
离线benbenmajia

只看该作者 21楼 发表于: 2012-06-05
Re:回 18楼(benbenmajia) 的帖子
引用第19楼kimtaikee于2012-06-05 09:33发表的 回 18楼(benbenmajia) 的帖子 :
你别忘了如果new 之后出现异常的话就不会执行到delete那部分,所以最好还是用智能指针。


你说的是另外一种情况,new创建一个指针的时候必须避免这种使用情况。
安然.....
离线kimtaikee

只看该作者 22楼 发表于: 2012-06-05
回 20楼(benbenmajia) 的帖子
1.如果这个槽只是在Gui主线程中被调用的话,那么在这个槽函数执行结束之前是不会再次进入这个函数的。智能指针放在那里ok。
2.如果你偏要把槽函数放在Gui主线程中,然后再起N个线程随机调用这个Gui主线程中的槽函数,那么你就得加锁机制了。

离线kimtaikee

只看该作者 23楼 发表于: 2012-06-05
回 21楼(benbenmajia) 的帖子
你这是嘛意思,难道new的时候就不能使用智能指针了 ?

离线benbenmajia

只看该作者 24楼 发表于: 2012-06-05
Re:回 20楼(benbenmajia) 的帖子
引用第22楼kimtaikee于2012-06-05 11:22发表的 回 20楼(benbenmajia) 的帖子 :
1.如果这个槽只是在Gui主线程中被调用的话,那么在这个槽函数执行结束之前是不会再次进入这个函数的。智能指针放在那里ok。
2.如果你偏要把槽函数放在Gui主线程中,然后再起N个线程随机调用这个Gui主线程中的槽函数,那么你就得加锁机制了。


就是这个意思。
安然.....
快速回复
限100 字节
 
上一个 下一个