Qt / C ++:可检查按钮和无限循环

时间:2014-03-26 15:12:59

标签: c++ qt

我正在编写一个Qt Gui,我正在尝试实现一个新功能,我现在想要达到的确切结果,但不是如何编写它。 我正在尝试添加一个可检查按钮,当检查时会运行一个只在取消选中该按钮时停止的功能,但是我在窗口上每秒都会更新一个PaintArea(让我看看我的函数的多次执行情况)正在改变我的数据)。看起来我需要使用一些QThread对象,但只是处理按钮的部分对我来说已经是反直觉了,我一直在尝试使用autoRepeatDelay和autoRepeatInterval来完成他们的工作以及如何处理它们对我有用。

我想我正在尝试编写的内容并不是真正原创的,会想到实现它的步骤,还是代码示例?

编辑: 根据第一个答案(顺便说一句,谢谢他们),我的问题可能并不清楚。把线程放在一边,我想实现一个无限循环,它只在按下按钮进入按下位置(它是一个可检查的按钮)时开始,并且只在离开它时停止。我尝试做的第一个版本(有一段时间(button-> isChecked()循环)将完全冻结,因为应用程序将运行循环,gui将冻结,按钮无法关闭(因此这个想法在一个单独的线程中运行它。。瞧!我希望它是一个更清晰的表述。提前谢谢你。

2 个答案:

答案 0 :(得分:1)

我不知道我是否真的明白你想做什么,但我会尽力回答。

首先,你想要一个发送开始和按钮的按钮。停止信息来控制一个线程。您可以使用复选框开始。此复选框在其状态更改时发送信号。将此信号连接到执行启动线程的插槽,并根据发送的布尔值停止。

其次,在你的线程中你需要启动事件循环。之后,设置一个定时器,在每次超时后调用重绘。

希望它有所帮助。

PS:用线程和Qt的对象来处理执行上下文。

答案 1 :(得分:1)

这是一个可能有用的简单骨架。在不知道您的确切要求的情况下,它可能适合您的问题,也可能不适合您。希望它会给你一些实际上有帮助的提示。

void Ui::buttonPressedSlot(bool checked){
    if (checked){
        Processor *processor = new Processor;
        connect(this, SIGNAL(abortCalculations()), processor, SLOT(abort()), Qt::QueuedConnection);
        connect(processor, SIGNAL(updateNeeded()), this, SLOT(updateGui()), Qt::QueuedConnection);
        QThreadPool::globalInstance()->start(processor);
    } else {
        emit abortCalculations(); // this is a signal in your UI class
    }
}

然后,您可以使用以下内容进行计算。

class Processor : public QObject, public QRunnable{ // QObject must always be first in multiple inheritance
    Q_OBJECT
public:
    ~Processor();

    void run();

public slots:
    void abort();
    void doCalculations();

signals:
    void updateNeeded(); // connect this to the GUI to tell it to refresh

private:
    QScopedPointer<QEventLoop> loop;
};

Processor::~Processor(){
    abort();
}

void Processor::run() {

    loop.reset(new QEventLoop);

    QTimer timer;
    connect(&timer, SIGNAL(timeout()), this, SLOT(doCalculations()));
    timer.setInterval(1000);
    timer.start();

    loop->exec();
 }

 void Processor::abort(){
    if (!loop.isNull()){
        loop->quit();
    }
 }

 void Processor::doCalculations(){
     // do whatever needs to be done

     emit updateNeeded();
 }