Qt(c ++) - 是否可以使用信号从方法返回?

时间:2015-07-03 20:55:45

标签: c++ qt

我正在开发一个应用程序,它可以拍摄图像并进行测量并绘制到图像中。这一切都是在一个方法中完成的,该方法包含涉及鼠标用户输入的几个步骤。使用工具栏上的按钮调用此方法。

我想知道在完成执行之前是否可以从此函数返回。似乎合乎逻辑的是,如果在执行这些步骤的过程中按下按钮,它将会取消"取消"第一个实例并启动这些步骤的新实例。或者换句话说,如何简单地取消执行此方法?

我能想到的一种方法是使用信号设置一个标志,并在每个步骤执行后检查该标志。如果flag == true,则返回。似乎应该有更好的方法来做这个,而不是几个if语句。

1 个答案:

答案 0 :(得分:0)

可以使用线程执行此操作,其他问题是停止它。您可以在执行每个流程步骤之前检查它... 那么示例实现可能如下所示? Worker在自己的线程中执行步骤(计时器模拟某些操作)。如果再次调用start,则步骤链将被新的替换。其他问题是如何处理当前被替换的步骤,但这是另一个问题。

class Step
{
public:
    virtual ~Step() {}
    void setNextStep( Step* next )
    {
        successor = next;
    }
    Step* nextStep()
    {
        return successor;
    }

    virtual void process() = 0;

private:
    Step* successor;
};

class Step1 : public Step
{
    virtual void process()
    {
        std::cout << "Step1" << std::endl;
    }
};

class Step2 : public Step
{
    virtual void process()
    {
        std::cout << "Step2" << std::endl;
    }
};

class Step3 : public Step
{
    virtual void process()
    {
        std::cout << "Step3" << std::endl;
    }
};

class Worker : public QObject
{
    Q_OBJECT
public:
    Worker( QObject* parent = 0 ) : QObject( parent ), timer( this )
    {
        QObject::connect( &timer, SIGNAL(timeout()), this, SLOT(work()));
    }
public slots:
    void start()
    {
        Step1* fStep = new Step1();
        Step2* sStep = new Step2();
        Step3* tStep = new Step3();
        fStep->setNextStep( sStep );
        sStep->setNextStep( tStep );
        currentStep = fStep;
        if( !timer.isActive() )
        {
            timer.start( 1 );
        }
    }

    void work()
    {
        currentStep->process();
        currentStep = currentStep->nextStep();
        if( !currentStep )
        {
            std::cout << "finished";
            timer.stop();
            //test one run emit
            emit quit();
        }
    }

    void stop()
    {
        std::cout << "stop" << std::endl;
        timer.stop();
        emit quit();
    }

signals:
    void quit();

private:
    QTimer timer;
    Step* currentStep;
};

int main( int argc, char* argv[] )
{
    QCoreApplication a( argc, argv );
    Worker* worker = new Worker();
    QThread* thread = new QThread();
    worker->moveToThread( thread );
    QObject::connect( thread, SIGNAL(started()), worker, SLOT(start()) );
    QObject::connect( thread, SIGNAL(finished()), &a, SLOT(quit()) );
    QObject::connect( worker, SIGNAL(quit()), thread, SLOT(quit()) );

    QTimer::singleShot( 0, thread, SLOT(start(Priority)));

    return a.exec();
}

BTW这个poc是一个很大的内存泄漏:)